2013-04-25 70 views
2

我是新来的正则表达式在C#中的东西。我阅读了任何我可以得到的手,并试图提出一个从日志中提取日期时间值的正则表达式。这是我正在使用的:RegEx.Match不返回预期的字符串

value = Regex.Match("abc 2012‎-‎12‎-‎23 01:13:51.253", 
        @"\b20[0-9][0-9]‎-[0-1][0-9]‎-‎[0-3][0-9] [0-2][0-9]:[0-5][0-9]:[0-5][0-9].\d+") 
      .Value; 

但是每当我得到“”的价值。有人可以帮助我,我做错了什么?

在此先感谢。

+2

你想匹配日期字符串吗?为什么不使用'DateTime.ParseExact'? – 2013-04-25 15:20:43

+0

是的..我正在努力做到这一点。但问题在于它没有很好地定义在日期时间到后每行中有多少个字符。所以不能给一个定义的输入DateTime.ParseExact – 2013-04-25 15:38:56

+0

请参阅下面的答案。我已经说明了如何使用格式字符串。 – 2013-04-25 15:40:40

回答

5

问题是微妙。您的搜索字符串中有一个隐藏的控制字符。在每个连字符之前和之后,有一个0x200e左对角个字符。我通过复制代码并检查字节来确认这一点。您也可以通过将光标放在-之前并按下退格键来测试。

您的模式字符串在第一个连字符之前以及第二个连字符之前和之后也包含这些隐藏的控制字符。

一旦我从搜索字符串和模式字符串中删除了该字符的所有实例,模式就会正确匹配。

您最好打赌是在您尝试做其他事情之前将这些字符从您的输入中删除。如果您正在按照其他人的建议进行RegEx或常规DateTime分析,则这适用。这是从你的字符串中删除这些字符的最简单的方法:

input = input.Replace(char.ConvertFromUtf32(0x202e).ToString(), string.Empty); 
+0

谢谢p.s.w.g.这看起来是问题。在这种情况下,我如何推广正则表达式来避免这些字符?或者我应该遵循其他方法? – 2013-04-25 15:47:33

+0

那么你可能想要在输入之前过滤掉你输入的那些字符(请参阅我的更新答案)*或*仔细构建你的模式以期望它们。无论您如何选择解析日期,这都适用。 – 2013-04-25 15:58:11

+0

+1,赶上! – AlexFoxGill 2013-04-25 16:05:54

0

如果你只是想学习正则表达式,那么你可以使用:

@"(^((((0[1-9])|([1-2][0-9])|(3[0-1]))|([1-9]))\x2F(((0[1-9])|(1[0-2]))|([1-9]))\x2F(([0-9]{2})|(((19)|([2]([0]{1})))([0-9]{2}))))$)" 

如果它是一个有效的使用情况的应用程序,那么你就应该解析它变成一个DateTime对象,使用像DateTime.ParseExact

0

下面是使用DateTime.ParseExact如何可以匹配字符串:我不知道什么样的“ABC”部分

string dateString = "2012-12-23 01:13:51.253"; 
string format = "yyyy-MM-dd hh:mm:ss.fff"; 

DateTime dateTime = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture); 

您串,但如果这一个月的三个字母的缩写,您可以在格式字符串改成这样:

string format = "MMM yyyy-MM-dd hh:mm:ss.fff"; 

下面是日期时间解析自定义格式代码的完整列表:http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

相关问题