5

我需要可以匹配多次出现的模式的 C# 字符串搜索算法。例如,如果模式是 'AA' 并且字符串是 'BAAABBB' 正则表达式生成匹配结果索引 = 1,但我需要结果索引 = 1,2。我可以强制正则表达式给出这样的结果吗?

4

6 回答 6

13

使用前瞻模式:-

“A(?=A)”

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

于 2009-01-08T10:26:54.590 回答
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");
于 2009-01-08T10:52:45.503 回答
0

任何正则表达式都可以给出MatchCollection的数组

于 2009-01-08T10:24:43.470 回答
0

正则表达式.Matches() http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.matchcollection.aspx

于 2009-01-08T10:26:25.993 回答
0

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

顺便说一句,您所说的搜索称为重叠匹配;我会把它添加到标签中。

于 2009-01-10T17:19:59.037 回答
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 + ",";
            }                       

index 的内容是您在删除最后一个逗号后要查找的内容。

于 2009-01-08T11:33:01.990 回答