2017-08-19 27 views
-1

我是新來的RegEx,我覺得它很混亂,所以我想要一個簡單的例子來說明如何提取同一類型的多個字符串。使用正則表達式提取多個字符串

比方說,我們有一個隨機字符串,我想要捕捉包圍「###」的任何東西。所以我認爲這種模式看起來像這樣:

string str = "dsad###hi###vdkv324da###dog###fs"; 
Regex pattern = new Regex("###.+###"); 

如何匹配和存儲多個事件?而更大的問題 - 在我這樣做後,我會留下「### hi ###」和「### dog ###」,那麼我如何從那些中提取「hi」和「dog」 ?

+2

首先,你必須定義您的要求。當你說_什麼是包圍「###」_這是不明確的。例如,在你的示例字符串中,整個'hi ### vdkv324da ### dog'部分位於兩個'###'s之間。那麼你的解決方案是什麼?你是否在使用兩個相鄰的'###'開啓和關閉部分? – Sach

+0

有一個很好的工具來測試正則表達式:https://regex101.com/雖然,請記住,.NET C#正則表達式有點特定,所以有些令牌可能無法正常工作。 –

+1

正則表達式並不總是最好的使用方法。在這種情況下,string()方法將起作用:string [] split = str.Split(new string [] {「###」},StringSplitOptions.RemoveEmptyEntries); – jdweng

回答

2

A工作液:

#{3}([^#]+)#{3}

#{3}  // 3 number signs, then 
([^#]+) // 1 or more characters excluding a number sign (captured as group), then 
#{3}  // 3 number signs 

Demo

+0

啊,我現在注意到了我的錯誤,謝謝! – Anna

1

這裏的另一種解決方案,如何提取部分字符串一起。使用您自己的原始版本Regex,並抓取相鄰的###之間的字符串。

string str = "dsad###hi###vdkv324da###dog###fs###d###"; 
Regex pattern = new Regex("###.+?###"); 

List<string> matched = new List<string>(); 
foreach(Match mat in pattern.Matches(str)) 
{ 
    string val = mat.Value; 
    int start = val.IndexOf("###") + 3; 
    int len = val.LastIndexOf("###") - start; 
    matched.Add(val.Substring(start, len)); 
} 

更新:串的更簡潔的提取:所有的

foreach(Match mat in pattern.Matches(str)) 
{ 
    matched.Add(mat.Value.Trim('#')); 
} 
+1

'string val = mat.Value.Trim('#');'更簡潔。 –

+0

@AlexanderPetrov確實是這樣!爲什麼我沒有想到這一點。更新答案。謝謝。 – Sach

相關問題