C# 正则表达式未返回正确的术语
请告诉我我的正则表达式出了什么问题:C# 正则表达式未返回正确的术语,c#,regex,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 所以字符串中的最后一个日期。我正在使用c#.net 4 谢谢。要返回所需内容,您必须从第一个捕获组$1中获取值,但必须删除?字符 逻辑上说,它将与非贪婪运算符一起工作,但我无法
expression = (?<=current run date :)([^\.]*?)
searchString = date : 2012-05-26 03:00:00.000 to current run date : 2012-05-26 04:00:00.000
所以字符串中的最后一个日期。我正在使用c#.net 4
谢谢。要返回所需内容,您必须从第一个捕获组
$1
中获取值,但必须删除?
字符
逻辑上说,它将与非贪婪运算符一起工作,但我无法解释为什么它不工作
如果将
*
乘数更改为+
,您将看到它返回数字和:
字符之间的第一个空格。问题的答案在最后:
*?
通常,*
的意思是“给我0个或更多匹配的字符,并给我尽可能多的字符。”这种“尽可能多的”称为“贪婪匹配”。那个?
符号是一个修饰符,它从贪婪匹配切换到非贪婪匹配,因此实际上它变成了“给我0个或更多匹配的字符,并给我尽可能少的字符”。在这种情况下,最少的数字是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
(?这个?
使得零个或多个量词*
以一种惰性或非贪婪的方式匹配。换句话说,它将尝试尽可能少地匹配。在这种情况下,它匹配一个空字符串,因为这显然是尽可能少的数量。因此,首先,您需要去掉这个?
接下来是您的字符序列[^\.]
告诉解析器它应该匹配除句点以外的任何字符
,但您的预期结果包括毫秒部分.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
绝对不是空格字符。对小数部分的理解很好。我正忙着纠正他的懒惰运算符,甚至没有注意到他的正则表达式的核心逻辑被破坏了。