有些人可以告诉我我的正则表达式是什么:
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。
感谢。
答案 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它将与非贪婪的运算符一起使用,但我无法解释为什么它不会。
如果您将*
乘数更改为+
,您会看到它返回数字与:
字符之间的第一个空格。