2011-01-14 94 views
0

我需要幫助的身影正則表達式表達子正則表達式C#

string = "STATE changed from [Fixed] to [Closed], CLOSED DATE added [Fri Jan 14 09:32:19 
MST 2011], NOTES changed from [CLOSED[]<br />] to [TEST CLOSED <br />]" 

我需要抓住NOTES changed from [CLOSED[]<br />] to [TEST CLOSED <br />],並採取價值CLOSED[]TEST CLOSED在兩個字符串變量。
到目前爲止,我到:

Regex NotesChanged = new Regex(@"NOTES changed from \[(\w*|\W*)\] to \[([\w-|\W-]*)\]"); 

其中只有「筆記從」起步之初匹配,並沒有「[]」中的「[]」,但我有「[關閉[] 「也不是」
「。 關於在正則表達式中改變什麼的想法。

感謝, 夏爾馬

+0


」每次都會在那裏嗎? – 2011-01-14 17:41:38

+0

是的,但該表達式不適用於「
」,我有些無法在我的線程中獲得那個「
」 – remo 2011-01-14 17:44:14

回答

1

如果「< br/>」每次都會在那裏,您可以使用我最喜歡的模式之一(它值得記憶)。該模式是:

delim[^delim]*delim 

模式上面會多次重新匹配一個分隔符,後跟任何東西,除了分隔符越好,然後分隔符。

這裏是正則表達式,我將嘗試使用:

NOTES changed from \[([^<]*)[^\]]*\] to \[([^<]*)[^\]]*\] 

英文:

  • 拿過開幕[
  • 捕獲#1中的所有字符,直到<(假設br標籤始終存在)
  • 閱讀直到關閉]
  • 重複s的Econd捕獲區
0

嘗試增加「\[|\]」到你的捕獲序列的支架小組。

Regex NotesChanged = new Regex(@"NOTES changed from \[(\w*|\W*|\[|\])\] to \[([\w-|\W-|\[|\]]*)\]"); 
1

這是一種奇怪的......

(\w*|\W*) 

一個捕獲組的所有字的字符零次或多次或所有非單詞字符零次或多次

你想要什麼如果你有相匹配的大括號,就要創建一個不消耗分隔符的模式。

\[([^\]]+)\] 

這將匹配[with some text in it]匹配的文本是匹配中的第一個組的任何匹配項。

既然你有相同類型的分隔符嵌套在字符串本身,它會變得更有趣,你需要使用「看頭」或某種改變。

((?:[^\[\]]|\[\])*) 

這可能是未來的改進,但這裏有一個問題,如果你有[[[]]]不能得到解決。您不能創建遞歸正則表達式。這不是那麼靈活。因此,您需要硬編碼最大深度或多次應用正則表達式。

這樣做的一個相當詳盡的辦法是

\[((?:[^\[\]]*)(?:(?=\[)(?:[^\]]*)\])?([^\]]))\] 
+0

感謝您的想法,我無法捕獲CLOSED []和TEST CLOSED它,但能夠匹配它們。但是瞭解這個正則表達式很好,我只是一個開始。再次感謝,我現在有解決方案 – remo 2011-01-14 18:03:21

+0

然後您對投票給您的解決方案的投票。你還應該仔細看看最後一個例子,它是正則表達式,因此看起來完全是重擊,但它與外括號匹配並處理一層嵌套。假設`
`標籤可能沒問題,並且由於我們似乎沒有正式的語法,所以這並不重要。但我強烈建議你考慮一下。這種方法存在漏洞。 – 2011-01-14 18:19:43

0

我相信你可以使用balancing group definitions匹配嵌套的括號。我相信這些都是特定於.NET的,至少在那個特定的實現方式中。還有那個頁面,我已經適應了你的輸入這裏一個例子:

class Program { 
    static void Main (string[] args) { 
     var input = "STATE changed from [Fixed] to [Closed], CLOSED DATE added [Fri Jan 14 09:32:19 MST 2011], NOTES changed from [CLOSED[]] to [TEST CLOSED ]"; 
     var regex = new Regex(@"NOTES changed from (((?'open'\[)[^\[\]]*)+((?'close-open'\])[^\[\]]*)+)*"); 

     foreach (var match in regex.Matches(input)) { 
      Console.WriteLine(match); 
     } 
    } 
} 

這將打印NOTES changed from [CLOSED[]] to [TEST CLOSED ]我。請注意,在我的適配中,如果方括號沒有正確平衡,我會忽略導致匹配失敗的表達位,以便將我的示例減少到滿足您的請求的最小最小值...表達式是已經非常不愉快地複雜。

編輯:剛纔看到你的問題編輯了一下,而我發佈。我在這裏提供的匹配「除[和]之外的任何內容」的正則表達式的部分應該能夠用您需要提取的子字符串的捕獲組來替換。

0

如果你有固定與特定的關鍵字或短語的正則表達式的奢侈品來說,下面的工作:

NOTES changed from (?:(?:\[)?([A-Z]+\[\]))<br />\] to \[([A-Z]+\s+[A-Z]+) 

以上將匹配字符串NOTES changed from [CLOSED[]<br />] to [TEST CLOSED並把CLOSED[]TEST CLOSED到2分開的小組。

更新

事實上,你可以通過使用.符(更多,有點非特異性)這個更短:

NOTES changed from (?:(?:\[)?([A-Z]+\[\])).+\[([A-Z]+\s+[A-Z]+) 

這意味着它會匹配上面,而不是針對匹配<br />標籤等的具體內容,它將匹配而不管介於兩者之間。