【发布时间】:2016-01-11 10:50:55
【问题描述】:
我有这个正则表达式,它可以找到一个 A、一个 B 和两个 C 的任何排列
(?:(?<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
所以它看起来是一个序列,其中我们有连续出现 3 次的任意 ABC 组合,但将前一个匹配的最后一个字符作为第一个字符。
希望我解释清楚..
我该怎么做?
【问题讨论】:
-
您需要使用正则表达式吗?即使有可能,我怀疑遍历字符串并计算相关字符会更快、更清晰。
-
@sln 看起来 OP 在最后一个示例中使用基于零的
Pos。 -
@PetSerAl - 没错,我要失明了。
-
如果只有 2 次“几乎连续”出现怎么办?你用什么语言写的? C#?只是正则表达式无济于事。您需要职位详情吗?