正则表达式抛出错误C#

时间:2015-04-30 08:21:36

标签: c# regex

我有一行文字,我正在创建一个正则表达式。我使用rexex101.com进行检查,我创建的正则表达式没有错误。这是文本行......

    <Msg Date="2015/04/29" Time="12:13:39:187" DateReceived="2015/04/29" TimeReceived="12:13:39:187"><Layer Name="MC"><SourceLayer Name="GUI" /><Message Name="OperatorLogin" Id="1" Status="Successful" /></Layer></Msg>

这是正则表达式......

    [<][a-zA-Z]\w+\s[a-zA-Z]\w+[=]"(?<date>(?<year>(?:\d{4}|\d{2})[\/\-](?<month>\d{1,2})[\/\-](?<day>\d{1,2})))"\s[a-zA-Z]\w+[=]"(?<time>(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2}:(?<milli>\.?\d{0,3})))"\s[a-zA-Z]\w+[=]"(?<date2>(?<year2>(?:\d{4}|\d{2})[\/\-](?<month2>\d{1,2})[\/\-](?<day2>\d{1,2})))"\s[a-zA-Z]\w+[=]"(?<time2>(?<hour2>\d{2}):(?<minutes2>\d{2}):(?<seconds2>\d{2}:(?<milli2>\.?\d{0,3})))"[>](?<logEntry>.*)

但是,当我将它带入我的程序时,它会引发错误,例如: &#39;出乎意料的角色&#39; &#39; Invaid expresson term&#39; &#39;无法识别的转义序列&#39; 我认为在开头使用@符号会阻止它读取斜杠作为转义字符等。

这就是它在程序中的表现......

                string strRegXPattern = @"([<][a-zA-Z]\w+\s[a-zA-Z]\w+[=]["'](?<date>(?<year>(?:\d{4}|\d{2})[\/\-](?<month>\d{1,2})[\/\-](?<day>\d{1,2})))["']\s[a-zA-Z]\w+[=]["'](?<time>(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2}:(?<milli>\.?\d{0,3})))["']\s[a-zA-Z]\w+[=]["'](?<date2>(?<year2>(?:\d{4}|\d{2})[\/\-](?<month2>\d{1,2})[\/\-](?<day2>\d{1,2})))["']\s[a-zA-Z]\w+[=]["'](?<time2>(?<hour2>\d{2}):(?<minutes2>\d{2}):(?<seconds2>\d{2}:(?<milli2>\.?\d{0,3})))["'][>](?<logEntry>.*))";

我不明白这一点?我想知道它是否与引号有关&#34;&#34;或尖括号&lt;&gt;我已经尝试将它们放入[],()[&#34;&#39;]等但它没有区别。任何人都可以看到我错在哪里?谢谢。

4 个答案:

答案 0 :(得分:5)

根据标准(强调我的):

  

在逐字字符串文字中,分隔符之间的字符逐字解释,唯一例外 quote-escape-sequence

因此,请尝试使用"更改""

string strRegXPattern = @"([<][a-zA-Z]\w+\s[a-zA-Z]\w+[=][""'](?<date>(?<year>(?:\d{4}|\d{2})[\/\-](?<month>\d{1,2})[\/\-](?<day>\d{1,2})))[""']\s[a-zA-Z]\w+[=][""'](?<time>(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2}:(?<milli>\.?\d{0,3})))[""']\s[a-zA-Z]\w+[=][""'](?<date2>(?<year2>(?:\d{4}|\d{2})[\/\-](?<month2>\d{1,2})[\/\-](?<day2>\d{1,2})))[""']\s[a-zA-Z]\w+[=][""'](?<time2>(?<hour2>\d{2}):(?<minutes2>\d{2}):(?<seconds2>\d{2}:(?<milli2>\.?\d{0,3})))[""'][>](?<logEntry>.*))";

答案 1 :(得分:2)

如果您使用的是逐字字符串,即@"",那么您需要通过将它们加倍来逃避引号...

所以:"变为""

string strRegXPattern = @"([<][a-zA-Z]\w+\s[a-zA-Z]\w+[=][""'](?<date>(?<year>(?:\d{4}|\d{2})[\/\-](?<month>\d{1,2})[\/\-](?<day>\d{1,2})))[""']\s[a-zA-Z]\w+[=][""'](?<time>(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2}:(?<milli>\.?\d{0,3})))[""']\s[a-zA-Z]\w+[=][""'](?<date2>(?<year2>(?:\d{4}|\d{2})[\/\-](?<month2>\d{1,2})[\/\-](?<day2>\d{1,2})))[""']\s[a-zA-Z]\w+[=][""'](?<time2>(?<hour2>\d{2}):(?<minutes2>\d{2}):(?<seconds2>\d{2}:(?<milli2>\.?\d{0,3})))[""'][>](?<logEntry>.*))";

Visual Studio应该使这些引号字符的位置非常明显,因为样式会随着字符串的结束而改变。

答案 2 :(得分:1)

在以@开头的C#字符串文字中,只有一个特殊字符:"如果您需要此字符,则必须使用另一个"转义它:

所以你的正则表达式应该是这样的:

string strRegXPattern = @"([<][a-zA-Z]\w+\s[a-zA-Z]\w+[=][""'](?...

请注意双引号。

<强> BUT

您要阅读的内容是xml字符串。您应该使用xml库来阅读它。 nbot重新发明轮子。

答案 3 :(得分:1)

如何使用XElement并将数据解析为XML?您的数据看起来是有效的XML。

var xelement = System.Xml.Linq.XElement.Parse("<Msg Date=\"2015/04/29\" Time=\"12:13:39:187\" DateReceived=\"2015/04/29\" TimeReceived=\"12:13:39:187\"><Layer Name=\"MC\"><SourceLayer Name=\"GUI\" /><Message Name=\"OperatorLogin\" Id=\"1\" Status=\"Successful\" /></Layer></Msg>");
var reslt = xelement.DescendantsAndSelf("Msg");
var time = reslt.Where(p => p.HasAttributes && p.Attributes("Time") != null).Select(p => p.Attribute("Time").Value).FirstOrDefault();
var date = reslt.Where(p => p.HasAttributes && p.Attributes("Date") != null).Select(p => p.Attribute("Date").Value).FirstOrDefault();
var dateReceived = reslt.Where(p => p.HasAttributes && p.Attributes("DateReceived") != null).Select(p => p.Attribute("DateReceived").Value).FirstOrDefault();

输出:

enter image description here enter image description here enter image description here

您可以使用DateTime.ParseDateTime.TryParse进一步操作。

示例:

enter image description here