正则表达式.匹配没有返回预期的字符串
本文关键字:字符串 返回 正则表达式 | 更新日期: 2023-09-27 18:11:04
我是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;
但是每次我都得到"的价值。有人能告诉我我做错了什么吗?
问题非常微妙。在搜索字符串中有一个隐藏的控制字符。在每个连字符之前和之后都有一个0x200e
或从左到右字符。我通过复制您的代码并检查字节来确认这一点。您也可以通过将光标放在-
前面并按退格键来测试这一点。
模式字符串也包含这些隐藏的控制字符,在第一个连字符之前,以及在第二个连字符之前和之后。
一旦我从搜索字符串和模式字符串中删除了这个字符的所有实例,模式就会正确匹配。
你最好的办法是在你尝试做任何其他事情之前把这些字符从你的输入中去掉。如果您像其他人建议的那样进行RegEx或传统的DateTime解析,则适用于此。这是从字符串中删除这些字符的最简单方法:
input = input.Replace(char.ConvertFromUtf32(0x202e).ToString(), string.Empty);
如果你只是想学习正则表达式,那么你可以使用:
@"(^((((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
的东西。
如何使用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