正则表达式匹配零次或一次字符串
本文关键字:一次 字符串 零次 正则表达式 | 更新日期: 2023-09-27 17:53:22
我试图使一个正则表达式匹配这个字符串{日期HH:MM:ss},但这里的技巧:HH, MM和ss是可选的,但它需要"HH",而不仅仅是"H"(这同样适用于MM和ss)。如果单个"H"显示,字符串不应该匹配。
我知道我可以使用H{2}来匹配HH,但我似乎不能使用该功能加上?
来匹配零或一次(零,因为它是可选的,并且一次最大值)。
到目前为止,我正在这样做(这显然是不工作):
Regex dateRegex = new Regex(@"'{Date H{2}?:M{2}?:s{2}?'}");
下一个问题。现在我在第一个字符串上有了匹配,我想只取HH:MM:ss部分并将其放在另一个字符串中(这将是TimeStamp对象的格式)。
我使用了同样的方法,像这样:
Regex dateFormatRegex = new Regex(@"(HH)?:?(MM)?:?(ss)?");
但是当我在"{日期HH:MM}"我没有火柴。为什么?
如果我添加像这样的空格Regex dateFormatRegex = new Regex(@" (HH)?:?(MM)?:?(ss)?");
,我有结果,但我不想要空格…我认为第一个括号需要转义,但'(
在这种情况下不起作用。我猜是因为它不是要匹配的字符串的一部分的括号,而是一个关键字符。
(H{2})?
匹配0个或两个H
字符。
然而,在你的情况下,写两次会更容易读:
Regex dateRegex = new Regex(@"'{Date (HH)?:(MM)?:(ss)?'}");
除此之外,确保没有任何函数可用于您要做的事情。解析日期是很常见的,而且大多数编程语言的标准库中都有函数——我敢打赌。net也有这样的函数。
在你的编辑中,你在结果中提到了一个不需要的前导空间…检查前导或尾随条件与你的regex一起,而不包括这个到结果中,你可以使用regex的环顾功能。
new Regex(@"(?<=Date )(HH)?:?(MM)?:?(ss)?")
(?<=…)是向后看模式。
使用此示例的正则表达式测试站点。
对于输入Date HH:MM:ss
,它将匹配两个正则表达式(带或不带向后看)。
但是输入FooBar HH:MM:ss
仍然会匹配一个简单的正则表达式,但是后面的查找在这里会失败。Lookaround不会改变结果的内容,但它可以防止错误匹配(例如,第二个输入不是Date)。
关于正则表达式的更多信息,请查看此处