C# 正则表达式抛出错误

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

我有一行文本,我正在为其创建一个正则表达式。我使用了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>.*)
但是,当我将其引入程序时,它会抛出错误,例如: “意外字符” “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数据时不需要它们。