2015-04-30 101 views
1

我有一行文本爲其創建正則表達式。我用rexex101.com來檢查,並且我創建的結果正則表達式沒有錯誤。這是文字的行...正則表達式拋出錯誤C#

<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>.*))"; 

我不明白這一點嗎?我不知道它是否與引號「」或尖括號<>有什麼關係,我試圖把它們放到[],()[「']等,但它沒有任何區別,任何人都可以看到我要去哪裏錯了?謝謝

+0

看起來你正在使用正則表達式解析XML,似乎這樣做的過於複雜的方式? – DavidG

+0

http://www.w3schools.com/xpath/ –

+0

嗨,是的,我知道使用RegEx似乎有點混亂,但我有一大堆文件一些XML,一些HTML,一些純文本。它們的格式都不同。我必須通過它們並提取日期和時間,以便它們都可以按照日期和時間的順序一起準備在列表中。我使用HTML文件的HtmlAgility Pack和文本文件的RegEx。 – NepSyn14

回答

5

根據標準(重點煤礦):

在逐字字符串中,分隔符之間的字符逐字解釋,該唯一的例外是一個報價轉義序列

因此,嘗試改變"""

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>.*))"; 
+0

是的,就是它@AlexD。非常感謝。使用正則表達式時總是會引起我的注意。 – NepSyn14

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應該使這些引用字符的位置非常明顯,因爲樣式會因爲它認爲字符串已經結束而改變。

+0

是@musefan,你是對的。它的確引起了波動的線條。我想我是通過使用[「']來解決這個問題的,我錯了! – NepSyn14

1

在C#字符串文字與@開始只有一個特殊字符:"如果你需要這個角色你有另一"逃吧:

讓你的正則表達式應該是這樣的:

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

請注意雙引號。

你所想讀的是一個XML字符串。你應該使用一個XML庫來讀取它。 nbot是否重新發明了車輪。

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 hereenter image description hereenter image description here

而且你可以操縱進而使用DateTime.ParseDateTime.TryParse

例子:

enter image description here

+0

謝謝@stribizhev。我對XElement不熟悉,我會試一試 – NepSyn14

+0

當然,我不堅持。無效的XML數據,這將失敗,但你會得到一個警告數據已損壞,使用正則表達式,你不會得到一個匹配,並且不會有任何警告,如果日期時間格式改變,你將不得不改變正則表達式在這裏,如果你使用'DateTime.Parse',你可以訪問關於日期,月份,年份,星期幾等信息。請不要理解我錯誤,我喜歡正則表達式,但在這種情況下,我相信你在處理有效的XML數據時不需要它們*。 –