0

有人可以告诉我我的正则表达式是怎么回事:

expression = (?<=current run date :)([^\.]*?)
searchString = date : 2012-05-26 03:00:00.000 to current run date : 2012-05-26 04:00:00.000 

表达式目前是我的正则表达式搜索词。我一直得到一个正确的匹配,但它没有返回我想要的,它返回“”。

下面是值,这是我正在寻找的正则表达式返回。

value = 2012-05-26 04:00:00.000

所以字符串中的最后一个日期。我使用 c# .net 4。

谢谢。

4

3 回答 3

1

你的问题的答案在最后:

*?

通常的*意思是“给我 0 个或更多匹配的字符,并给我尽可能多的字符”。“尽可能”被称为“贪婪匹配”。该?符号是一个从贪婪匹配切换到非贪婪匹配的修饰符,因此它实际上变成了“给我 0 个或更多匹配的字符,并给我尽可能少的字符。”。在这种情况下,最小的数字是 0。

因此,解决方法是?从您的表达式中删除该字符:

(?<=current run date :)([^\.]*)

编辑:还值得注意的是,您在这里使用了前瞻,但您不需要。前瞻是昂贵的,因此除非需要,否则不应使用它们。您可以将您的正则表达式更改为:

current run date :([^\.]*)

您仍然会得到相同的结果,但引擎应该能够更快地返回您的结果(开销更少)。

于 2012-05-30T16:26:58.520 回答
1

使?零个或多个量词*以惰性或非贪婪的方式匹配。换句话说,它将尝试尽可能少地匹配。在这种情况下,它匹配一个空字符串,因为这显然是可能的最少数量。所以首先,你需要摆脱它?

接下来,您的字符序列[^\.]告诉解析器它应该匹配除句点以外的任何字符.,但您的预期结果包括毫秒部分.000,其中明确包含句点。该部分不会与字符序列匹配,因此您会得到类似2012-05-26 04:00:00.

您可能希望更具体地使用您的模式。如果你知道你会得到这种格式的日期,这样的事情应该可以工作:

expression = current run date :\s+(\d{4}\-\d{2}\-\d{2}\s\d{2}:\d{2}:\d{2}\.\d{3})

或者你可以不那么严格并匹配接下来的两个单词

expression = current run date :\s+(\S+\s\S+)

注意:\d是十进制字符[0-9]\s是空格字符,例如空格、制表符、换行符,\S不是空格字符。

于 2012-05-30T16:28:48.533 回答
0

要返回您想要的,您必须从第一个捕获组中获取值,$1但您必须删除?字符。

逻辑上说它可以与那个非贪婪的运算符一起工作,但我无法解释为什么它不能。

如果将*乘数更改为,+您将看到它返回数字和:字符之间的第一个空格。

于 2012-05-30T16:23:21.603 回答