繁体   English   中英

.NET Regex重叠匹配最后一个字符

[英].NET Regex overlaping matches taking last character

我有这个RegEx找到一个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正则表达式重叠匹配的数量

现在我需要找到所有可能组合的序列,例如,ABC,但是3次并重叠一个字符。

例如,对于以下顺序:

AABCBACBCCAACCB

这将具有位置1的序列

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

所以它看起来是一个序列,我们有连续三次出现的ABC的任意组合,但是作为前一个匹配的最后一个的第一个字符。

我希望我解释得很好..

我怎样才能做到这一点?

您可以通过对@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}.

以下是如何在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演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM