C#多字符串匹配

5

我需要一种C#字符串搜索算法,可以匹配多个模式的出现。例如,如果模式是“AA”,字符串是“BAAABBB”,则正则表达式会产生匹配结果Index = 1,但我需要结果Index = 1,2。我能强制正则表达式给出这样的结果吗?


正则表达式模式'(?=A)'可以得到很好的结果,但计算时间非常长。我有一个包含2000万个字符的字符串,计算速度非常重要。是否有其他解决方案?谢谢。 - matko
“(?=A)” 不会做你想要的事情,你试过像 AnthonyWJones 建议的“ A(?=A) ”吗? - Alan Moore
6个回答

13

使用向前查找模式:

"A(?=A)"

这会找到任何后面跟随着另一个A的A,而不会消耗紧随其后的A。因此AAA将会匹配这个模式两次。


4

总结之前所有的评论:

Dim rx As Regex = New Regex("(?=AA)")
Dim mc As MatchCollection = rx.Matches("BAAABBB")

这将产生您所请求的结果。
编辑:
这是C#版本(今天使用VB.NET,所以我不小心继续使用了VB.NET)。
Regex rx = new Regex("(?=AA)");
MatchCollection mc = rx.Matches("BAAABBB");

0


0

你真的在寻找只有两个字符长的子字符串吗?如果是这样,在一个2000万字符的字符串中进行搜索无论使用什么正则表达式(或任何非正则表达式技术)都会很慢。如果搜索字符串更长,正则表达式引擎可以采用像Boyer-Moore或Knuth-Morris-Pratt这样的搜索算法来加速搜索——事实上,字符串越长,效果越好。

顺便说一下,你所谈论的搜索类型称为重叠匹配;我会将其添加到标签中。


0

试试这个:

       System.Text.RegularExpressions.MatchCollection  matchCol;
       System.Text.RegularExpressions.Regex regX = new System.Text.RegularExpressions.Regex("(?=AA)");

        string index="",str="BAAABBB"; 
        matchCol = regX.Matches(str);
        foreach (System.Text.RegularExpressions.Match mat in matchCol)
            {
                index = index + mat.Index + ",";
            }                       

索引的内容是您要查找的内容,最后一个逗号已被删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接