C# 正则表达式抛出错误
我有一行文本,我正在为其创建一个正则表达式。我使用了rexex101.com进行检查,我创建的正则表达式没有错误。这是一行文字C# 正则表达式抛出错误,c#,regex,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="Operat
<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>.*)
但是,当我将其引入程序时,它会抛出错误,例如:
“意外字符”
“Invaid expresson术语”
“无法识别的转义序列”
我认为在开头使用@符号可以防止它将斜杠读作转义字符等
这就是它在程序中的外观
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应该非常清楚这些引号字符的位置,因为样式会随着认为字符串已结束而改变。如果使用逐字字符串,即@,则需要通过将引号加倍来转义引号 所以:变成
Visual studio应该明确这些引号字符的位置,因为样式会随着它认为字符串已结束而改变。在以@开头的C字符串文字中,只有一个特殊字符:如果需要此字符,则必须用另一个字符转义: 因此,您的regexp应该如下所示:
string strRegXPattern = @"([<][a-zA-Z]\w+\s[a-zA-Z]\w+[=][""'](?...
请注意双引号
但是
您试图读取的是一个xml字符串。您应该使用xml库来阅读此内容。不要重新发明轮子。在以@开头的C字符串文字中,只有一个特殊字符:如果需要此字符,必须用另一个字符转义: 因此,您的regexp应该如下所示:
string strRegXPattern = @"([<][a-zA-Z]\w+\s[a-zA-Z]\w+[=][""'](?...
请注意双引号
但是
您试图读取的是一个xml字符串。您应该使用xml库来阅读此内容。不要重新发明轮子。使用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进一步操作
例如:
使用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进一步操作
例如:
看起来你正在使用正则表达式来解析XML,这似乎是一种过于复杂的方法?嗨,是的,我知道使用正则表达式似乎有点混乱,但我有一大堆文件—一些XML,一些html,一些纯文本。它们的格式都不同。我必须把它们全部检查一遍,然后提取日期和时间,这样它们就可以按照日期和时间的顺序,在一个列表中一起准备好。我对html文件使用了HtmlAgility Pack,对文本文件使用了RegEx。看起来你在使用RegEx解析XML,这似乎是一种过于复杂的方法?嗨,是的,我知道使用RegEx似乎有点混乱,但我有一大堆文件一些XML,一些html,一些纯文本。它们的格式都不同。我必须把它们全部检查一遍,然后提取日期和时间,这样它们就可以按照日期和时间的顺序,在一个列表中一起准备好。我对html文件使用了HtmlAgility Pack,对文本文件使用了RegEx。是的,就是@AlexD。非常感谢你。当我使用正则表达式的时候,总是有一些小事情让我感到困惑。是的,就是它@AlexD。非常感谢你。在使用正则表达式时,总是有一些小事情让我感到困惑。是的@musefan,你是对的。它确实吐出了弯弯曲曲的线条。我以为我是通过使用[']来解决这个问题的。我错了!是的@musefan,你是对的。它确实吐出了弯弯曲曲的线条。我以为我是通过使用[']来解决这个问题的。我错了!谢谢你,斯特里比雪夫。我不熟悉XElement。我会试试的。当然,我不坚持。如果您收到无效的XML数据,这将失败。但您将收到一条警告,说明数据已损坏。使用正则表达式,您将无法获得匹配,并且不会收到任何警告。如果日期时间格式更改,则必须更改正则表达式。在这里,如果您使用DateTime.Parse,您可以访问有关天、月、年、周等的信息。请不要误解我的意思,我喜欢正则表达式,但在这种情况下,我相信您在处理有效的XML数据时不需要它们。谢谢@Stribizev。我不熟悉希莱姆
耳鼻喉科。我会试试的。当然,我不坚持。如果您收到无效的XML数据,这将失败。但您将收到一条警告,说明数据已损坏。使用正则表达式,您将无法获得匹配,并且不会收到任何警告。如果日期时间格式更改,则必须更改正则表达式。在这里,如果您使用DateTime.Parse,您可以访问有关天、月、年、周等的信息。请不要误解我的意思,我喜欢正则表达式,但在这种情况下,我相信在处理有效的XML数据时不需要它们。