2

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

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;

但每次我得到“”的价值。有人可以帮我看看我做错了什么吗?

提前致谢。

4

3 回答 3

5

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

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

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

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

input = input.Replace(char.ConvertFromUtf32(0x202e).ToString(), string.Empty);
于 2013-04-25T15:32:05.053 回答
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

于 2013-04-25T15:39:22.787 回答
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.

于 2013-04-25T15:22:47.890 回答