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

时间:2011-04-26 22:22:59

标签: c# regex

我已经在这里工作了一个多小时没有成功,而且它正在努力。

我正在尝试制作一个与此字符串匹配的正则表达式{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)?");我有结果,但我不想要空间...... 我认为第一个括号需要被转义,但是(在这种情况下不会起作用,我想因为它不是一个括号中的一个括号,而是一个关键字符。

2 个答案:

答案 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

的更多信息