Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式未返回正确的术语_C#_Regex - Fatal编程技术网

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
绝对不是空格字符。

对小数部分的理解很好。我正忙着纠正他的懒惰运算符,甚至没有注意到他的正则表达式的核心逻辑被破坏了。