2015-07-20 57 views
3

我有這樣的正則表達式,用於查找任何置換與一個A,一個B和兩個C的overlaping的.NET的Regex數

(?:(?<A>A)|(?<B>B)|(?<C>C)){4}(?<-A>)(?<-B>)(?<-C>){2} 

例如用於這樣的組合,我們有3個匹配(位置1,7,15 )

ABCCABCABCABCAABCC 

我們需要知道我們有多少重疊匹配。在這種情況下,當我們在前4個位置找到匹配時,它開始尋找位置5中的另一個匹配。

我們需要它開始尋找位置2中的下一場比賽,所以比賽將會在位置:1,2,3,4,7,10,15

我們不得不7場比賽在這個例子中

1. ABCC 
2. BCCA 
3. CCAB 
4. CABC 
7. CABC 
10. CABC 
15. ABCC 

如何使用正則表達式來開始尋找下一場比賽,纔有可能在下一個位置,而不是完整的安全之後的下一個位置?

在此先感謝。

回答

2

您需要使用capturing grouplook-ahead

here

向前斷言不字符串中消耗任何字符。因此,您可以使用它們查找重疊的字符序列。

(?=(?<value>(?:(?<A>A)|(?<B>B)|(?<C>C)){4}(?<-A>)(?<-B>)(?<-C>){2})) 
^               ^

如果你想在正則表達式的匹配存儲在先行裏面,你必須把捕獲括號周圍的正則表達式先行裏面,像這樣:(?=(regex))

更多details on overlapping matches using regex可以在Rexegg.com找到。

demo

enter image description here

+0

我希望這會爲你工作。如果您有任何疑問,請隨時發表評論。 –

+1

完美的是,自從我幾分鐘前意識到之後,我將發佈解決方案。非常感謝 –

2

如果你想有一個通用的方法來找到任何正則表達式重疊的匹配,只是在自己的循環邏輯:

var re = new Regex(@"(?:(?<A>A)|(?<B>B)|(?<C>C)){4}(?<-A>)(?<-B>)(?<-C>){2}"); 
var input = "ABCCABCABCABCAABCC"; 

var m = re.Match(input); 
while (m.Success) 
{ 
    Console.WriteLine(m.Value); 

    // End of string reached 
    if (m.Index == input.Length) 
     break; 

    // Match from the next index 
    m = re.Match(input, m.Index + 1); 
} 

你甚至可以解壓到一個擴展方法:

public static IEnumerable<Match> OverlappingMatches(this Regex regex, string input) 
{ 
    var match = regex.Match(input); 

    while (match.Success) 
    { 
     yield return match; 

     if (match.Index == input.Length) 
      break; 

     match = regex.Match(input, match.Index + 1); 
    } 
}