我已经在这里工作了一个多小时没有成功,而且它正在努力。
我正在尝试制作一个与此字符串匹配的正则表达式{Date 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}?\}");
请帮助我,抱歉这个noob问题。
FB。
接下来的问题,既然我在第一个字符串上有匹配,我想只接受HH:MM:ss部分并将其放在另一个字符串中(这将是TimeStamp对象的格式)。
我使用了相同的方法,如下所示:
Regex dateFormatRegex = new Regex(@"(HH)?:?(MM)?:?(ss)?");
但是当我在“{Date HH:MM}”上尝试时,我没有匹配,为什么?
编辑:如果我添加这样的空格Regex dateFormatRegex = new Regex(@" (HH)?:?(MM)?:?(ss)?");
我有结果,但我不想要空间......
我认为第一个括号需要被转义,但是(在这种情况下不会起作用,我想因为它不是一个括号中的一个括号,而是一个关键字符。
答案 0 :(得分:22)
(H{2})?
匹配零个或两个H
个字符。
但是,在你的情况下,写两次会更具可读性:
Regex dateRegex = new Regex(@"\{Date (HH)?:(MM)?:(ss)?\}");
除此之外,请确保没有任何功能可用于您正在尝试的任何操作。解析日期很常见,大多数编程语言都在其标准库中具有功能 - 我几乎打赌我的声誉只有{1}具有这样的功能。
答案 1 :(得分:1)
在您的编辑中,您在结果中提到了一个不需要的前导空格...与正则表达式一起检查前导或尾随条件,而不将其包含在结果中,您可以使用正则表达式的外观特征。
new Regex(@"(?<=Date )(HH)?:?(MM)?:?(ss)?")
(?&lt; = ...)是一种外观模式。
Regex test site这个例子。
修改强>
输入Date HH:MM:ss
将匹配两个正则表达式(有或没有lookbehind)
但输入FooBar HH:MM:ss
仍将匹配一个简单的正则表达式,但lookbehinde将在这里失败。 Lookaround不会更改结果的内容,但会阻止错误匹配(例如,这不是日期的第二个输入)
查找有关正则表达式和外观here
的更多信息