我有这个RegEx找到一个A,一个B和两个C&#39的任何排列
(?:(?<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}))
^ ^
我们在这个例子中有7场比赛
1. ABCC
2. BCCA
3. CCAB
4. CABC
7. CABC
10. CABC
15. ABCC
正如stribizhev在上一篇文章中所做的那样: .NET Regex number of overlaping matches
现在我需要找到所有可能组合的序列,例如ABC,但需要3次并重叠一个字符。
例如,对于以下序列:
AABCBACBCCAACCB
这将使序列位于第1位
Pos 1. ABC
Pos 3. CBA
Pos 5. ACB
所以它看起来是一个序列,我们有连续三次出现的ABC的任意组合,但是作为前一个匹配的最后一个的第一个字符。
我希望我解释得很好..
我该怎么做?
答案 0 :(得分:3)
您可以通过对@stribizhev解决方案进行简单修改来实现此目的。
首先,您只有i18next\i18next.js
而不是两个:
C
由于你想从最后一个角色开始新的匹配,你可以使用先行断言并只捕获它后面的两个字符:
(?:(?<A>A)|(?<B>B)|(?<C>C)){3}(?<-A>)(?<-B>)(?<-C>)
现在你只需重复三次并捕获最后一个字符:
(?=(?:(?<A>A)|(?<B>B)|(?<C>C)){3}(?<-A>)(?<-B>)(?<-C>))..
答案 1 :(得分: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