2017-06-28 42 views
-1

我有這樣的測試代碼:如何調試這個正則表達式拼圖?

string triggerPoint = "<TP DDI=\"\" DQ=\"Y\" EDN=\"141040\" NE=\"141049\" NSU=\"141049\" OOH=\"141049\" QZ=\"1007\" QDN=\"141050\" QF=\"141049\" QT=\"M\" RC=\"141049\" RC2=\"\" TWE=\"141049\"/>"; 
     string pattern = "(?<=QZ=\").*?(?=\"\\s)"; 

     var match = Regex.Match(triggerPoint, pattern); 

     string queueID = match.Groups[0].Value; 

     Assert.AreEqual("1007", queueID); 

其中一期工程,但下面的代碼不會:

string triggerPoint = "<TP DDI=\"\" DQ=\"Y\" EDN=\"141040\" NE=\"141049\" NSU=\"141049\" OOH=\"141049\" Q=\"1007\" QDN=\"141050\" QF=\"141049\" QT=\"M\" RC=\"141049\" RC2=\"\" TWE=\"141049\"/>"; 
     string pattern = "(?<=Q=\").*?(?=\"\\s)"; 

     var match = Regex.Match(triggerPoint, pattern); 

     string queueID = match.Groups[0].Value; 

     Assert.AreEqual("1007", queueID); 

我所做的是從QZ在triggerPoint串並刪除在Z模式。但是,現在不是返回1007的隊列ID,而是返回「Y」。

第二個片段是我真正需要的工作。請有人能告訴我什麼是錯的?

+0

'DQ = \「Y \''這是否給你一個線索?嘗試'string pattern =「(?<= \\ bQ = \」)。*?(?= \「\\ s)」;' – ClasG

+0

這是某種XML,爲什麼不使用XML解析器? –

回答

2

正則表達式(你試)

(?<=Q=").*?(?="\s) 

匹配(雙引號後面有一個空格)Q=""之間的任何東西。它不在乎Q之前的內容。

如果您在Q前添加字邊界它將確保沒有字符(數字也)存在之前它,就像在DQ="Y"的情況下,這是你的正則表達式找到什麼。所以

(?<=\bQ=").*?(?="\s) 

應該這樣做。

See it here at regex101。 (regex101不支持支持 C#的味道,但它比替代品(我知道)和RE是相同的更多說明)。

不要忘了逃避必要的字符。

+0

Hi ClasG。首先,讓我說我敬畏任何能夠破譯正則表達式的人,所以非常感謝你的解釋,並且你有我的不倦的讚歎! 開始時無法讓它正常工作,但是一旦我逃過了\ b即(?<= \\ bQ = \「)。*?(?= \」\\ s),它就有了一種享受。我真的不明白爲什麼它需要逃避,因爲它不是一個文字,但它的作品,所以我很高興:-) –

+1

很高興幫助。由於'\ b'是一個正則表達式元字符,''''''由正則表達式解析器解釋。要在C#中的字符串中有一個字面值'''',它需要被轉義。否則C#將它視爲轉義字符,並將'\ b'解釋爲* backspace *。你當然可以使用verbatim-string-literal來避免:'string pattern = @「(?<= \ bQ =」「)。*?(?=」「\ s)」「;'。你看,你必須有兩個雙引號。(如果這個答案讓它適合你,請標記爲已接受;) – ClasG