我有一行文字,我正在创建一个正则表达式。我使用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;]等但它没有区别。任何人都可以看到我错在哪里?谢谢。
答案 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();
输出:
您可以使用DateTime.Parse
或DateTime.TryParse
进一步操作。
示例: