正则表达式没有返回正确的术语

时间:2012-05-30 16:15:20

标签: c# regex

有些人可以告诉我我的正则表达式是什么:

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。

感谢。

3 个答案:

答案 0 :(得分:1)

你问题的答案就在最后:

*?

通常*表示“给我0个或更多匹配的字符,并尽可能多地给我。” “尽可能多”被称为“贪婪匹配”。 ?符号是一个修改器,可以从贪婪匹配切换到非贪婪匹配,因此有效地变为“给我0个或更多匹配的字符,并尽可能地给我尽量少。”。在这种情况下,最少的数字是0。

所以解决方法是从表达式中删除?个字符:

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

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

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

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

答案 1 :(得分: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除了空间角色。

答案 2 :(得分:0)

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

逻辑sais它将与非贪婪的运算符一起使用,但我无法解释为什么它不会。

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