2012-08-15 82 views
3

我試圖捕獲由另一個關鍵字或行結束與關鍵字可能重複,以任何順序或沒有數據捕獲的關鍵字的值:c#正則表達式捕獲重複的關鍵字值

關鍵詞: K1,K2

輸入數據: somedatahereornotk1capturethis1k2capturethis2k2capturethis3k1k2

我想捕捉到的數據是

1. capturethis1 
2. capturethis2 
3. capturethis3 
4. 
5. 

我試過k1|k2(?<Data>.*?)k1|k2,但捕獲的數據總是空的。

謝謝!

回答

3

你正處於正確的軌道上,缺失的部分是使用後視和前瞻來斷言必須在分隔符前面和後面加上一些內容。

(?<=k1|k2)(?<Data>.*?)(?=k1|k2) 

回顧後(?<=…)和預讀(?=…)都是零寬度斷言,因此他們必須得到滿足,但不會成爲比賽的一部分。

您希望捕獲連續的定界符的實例有點棘手,因爲您無法真正捕獲「無」 - 兩個字符之間的空間。一種方法是捕捉回顧後(或先行):

(?<=(?<Delimiter>k1|k2))(?<Data>.*?)(?=k1|k2) 

這將產生4個結果,而不是3,因爲它會包括你的樣品數據結束連續k1k2。您只需忽略每場比賽的額外數據(​​, k2, k2,​​)。

3

首先,要知道,交替操作|具有低優先級,因此

k1|k2(?<Data>.*?)k1|k2 

實際上是尋找​​或k2(?<Data>.*?)k1k2。使用分組:

(?:k1|k2)(?<Data>.*?)(?:k1|k2) 

其次,考慮使用零寬度預測先行和後向斷言:

(?<=k1|k2)(?<Data>.*?)(?=k1|k2) 
+0

我調整稍微得到分隔行尾的最後一個捕獲:(<? =?k1 | k2)(?。*?)(?= k1 | k2 | $),但除此之外它是現貨! – Dvlpr2878 2012-08-15 14:27:37

0
string s="somedatahereornotk1capturethis1k2capturethis2k2capturethis3k1k2"; 

Regex r=new Regex("(?<=k1|k2).*?(?=k1|k2)"); 
foreach(Match m in r.Matches(s)) 
Console.WriteLine(m.Value);