RegEx.Match不返回预期的字符串

时间:2013-04-25 15:18:15

标签: c# regex

我是c#中regex东西的新手。我阅读了我可以得到的任何东西,并尝试提出一个正则表达式来从我的日志中提取日期时间值。这就是我正在使用的:

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;

但每次我都有“价值”。有人可以帮我解决一下我做错了什么吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分: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对象。

答案 2 :(得分:0)

以下是使用DateTime.ParseExact匹配字符串的方法:

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);

我不确定字符串的'abc'部分是什么,但如果这是一个月的三字母缩写,您可以将格式字符串更改为:

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

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