2016-01-22 21 views
-1

這是非常類似的問題在這裏:How do I extract text that lies between parentheses (round brackets)?我看到這個表達式代碼:解析字符串,給出的字符串之間保持所有比賽中(多字符分隔符)

var matches = Regex.Matches("User name [[sales]] and [[anotherthing]]", @"\[\[([^)]*)\]\]"); 

但是,沒有按」 t似乎與多字符分隔符一起工作?這可能不是正確的方法,但我相信我不是第一個嘗試這個,我在這裏畫空白 - 任何人?

+3

使用'Regex.Matches'。 –

+1

我投票結束這個問題作爲離題,因爲這可以解決檢查intellisense建議或只是檢查什麼方法'正則表達式'對象支持MSDN。 –

+0

我更新了它,以更準確地解決我的問題。 Wiktor的回答原來的問題,但事實證明,沒有爲我的實際情況這麼好。 – naspinski

回答

3

@"\[\[([^)]*)\]\]"模式匹配兩個連續[[,接着以比其他)零個或多個字符,然後,接着有兩個]]。這意味着,如果您在[[...]]內有),則不會有匹配。

要處理多字符分隔的子字符串,可以使用2種方法:延遲點匹配或展開的模式。

注意:獲得多個匹配,使用Regex.Matches正如我在其他的答案中寫道。

1.懶惰點溶液

var s = "User name [[sales]] and [[anotherthing]]"; 
var matches = Regex.Matches(s, @"\[{2}(.*?)]{2}", RegexOptions.Singleline) 
     .Cast<Match>() 
     .Select(p => p.Groups[1].Value) 
     .ToList(); 

regex demo.需要RegexOptions.Singleline修飾符才能匹配換行符號。

2.展開正則表達式溶液

var s = "User name [[sales]] and [[anotherthing]]"; 
var matches = Regex.Matches(s, @"\[{2}([^]]*(?:](?!])[^]]*)*)]{2}") 
     .Cast<Match>() 
     .Select(p => p.Groups[1].Value) 
     .ToList(); 

有了這一個,RegexOptions.Singleline不是必需的,並且它是更加有效和更快。

regex demo

+1

哇,這是太棒了,謝謝你!我非常欣賞你的正則表達式的知識! – naspinski

2

使用Regex.Matches

搜索指定的輸入字符串所有出現指定的正則表達式的

樣品的編號:

var matches = Regex.Matches("User name (sales) and (anotherthing)", @"\(([^)]*)\)") 
      .Cast<Match>() 
      .Select(p => p.Groups[1].Value) 
      .ToList(); 
+0

這很好,但...顯然我的正則表達式是垃圾,因爲它實際上是模式[[something]] - 並且subbing「\ [\ [」for「\(」似乎不是正確的? – naspinski

+0

如果您擁有多字符分隔符,單獨否定的字符類也無濟於事。我將發佈另一種答案。 –