2015-10-13 41 views
3

我有這樣的正則表達式,用於查找任何置換與一個A,一個B和兩個C的.NET正則表達式overlaping匹配服用最後一個字符

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

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

ABCCABCABCABCAABCC 

如果我加入前向斷言我可以算巧合開始對下一個位置,而不是完整的序列之後的下一個位置的數字

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

,我們不得不在這個例子中

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

由於stribizhev幫助在此之前的帖子7場比賽: .NET Regex number of overlaping matches

現在我需要找到的所有可能的組合序列,例如,ABC,但是3次並且重疊一個字符。

例如,對於下面的順序:

AABCBACBCCAACCB 

這將有序列中的位置1

Pos 1. ABC 
Pos 3. CBA 
Pos 5. ACB 

所以看起來我們有出現3次ABC的任意組合序列但是將第一個角色作爲以前比賽的最後一個角色。

我希望我解釋以及..

我怎樣才能做到這一點?

+0

你需要這樣做與正則表達式?即使有可能,我懷疑迭代字符串並計算相關字符會更快更清晰。 – LukeH

+0

@sln看起來像OP在上例中使用基於零的「Pos」。 – PetSerAl

+0

@PetSerAl - 對吧,我會失明。 – sln

回答

3

您可以通過簡單修改@stribizhev解決方案來實現此目的。

首先,你只有C不是兩個:

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

當你想從最後一個字符開始新的比賽,你可以使用前向斷言和後捕捉只有兩個角色:

(?=(?:(?<A>A)|(?<B>B)|(?<C>C)){3}(?<-A>)(?<-B>)(?<-C>)).. 

現在您只需重複三次並捕獲最後一個字符:

(?:(?=(?:(?<A>A)|(?<B>B)|(?<C>C)){3}(?<-A>)(?<-B>)(?<-C>))..){3}. 
+0

感謝您的回答。我想我們正在接近。我想編輯我的問題,因爲我覺得我沒有解釋清楚。 –

+0

@MikeJohnson我編輯了我的答案。 – PetSerAl

+0

太棒了!有用。謝謝 –

0

這裏是你如何能做到這一點在C#中 - 注意,s變量將在整個過程中被修改,所以在克隆它,或者使用一個副本:

var s = "AABCBACBCCAACCB AABCBACBCCAACCB AABBBAABCCAACCB"; 
var rx = new Regex("(?=(?<value>(?:(?<A>A)|(?<B>B)|(?<C>C)){3}(?<-A>)(?<-B>)(?<-C>)))"); 
var m = rx.Match(s); 
while (m.Success) 
{ 
    var list = new List<string>(); 
    list.Add(m.Groups["value"].Value); 
    s = s.Substring(m.Groups["value"].Index+m.Groups["value"].Length-1); 
    m = rx.Match(s); 
    if (m.Success && m.Groups["value"].Index == 0) 
    { 
     list.Add(m.Groups["value"].Value); 
     s = s.Substring(m.Groups["value"].Index+m.Groups["value"].Length-1); 
     m = rx.Match(s); 
     if (m.Success && m.Groups["value"].Index == 0) 
     { 
      list.Add(m.Groups["value"].Value); 
      Console.WriteLine(string.Join(", ", list)); 
      s = s.Sustring(m.Groups["value"].Index+m.Groups["value"].Length-1); 
      m = rx.Match(s); 
     } 
    } 
} 

IDEONE demo