正则表达式匹配零次或一次字符串

本文关键字:一次 字符串 零次 正则表达式 | 更新日期: 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)。

关于正则表达式的更多信息,请查看此处