如何找到可重复的字符

时间:2012-04-24 08:52:48

标签: c# regex

我无法理解如何解决以下问题:

我输入字符串" aaaabaa"我试图搜索字符串" aa" (我正在寻找角色的位置) 预期的结果是 0 1 2 5

  • aa aabaa
  • a aa abaa
  • aa aa baa
  • aaaab aa

我已经使用另一种方法(非RegEx)解决了这个问题。 但是我需要一个RegEx,我是RegEx的新手,所以google-search无法帮助我。 任何帮助赞赏!谢谢!

P.S。 我曾尝试使用(aa)*"\b(\w+(aa))*\w+",但这些表达方式错误

3 个答案:

答案 0 :(得分:2)

您可以使用前瞻

解决此问题
a(?=a)

会找到每个“a”后跟另一个“a”。

如果你想更普遍地这样做

(\p{L})(?=\1)

这将找到后面跟有相同字符的每个字符。每个找到的字母都存储在一个捕获组中(由于括号左右),capturing group(?=...))会使用\1(在\1中重复使用此positive lookahead assertion \p{L}存储了匹配字符)

String text = "aaaabaa"; Regex reg = new Regex(@"(\p{L})(?=\1)"); MatchCollection result = reg.Matches(text); foreach (Match item in result) { Console.WriteLine(item.Index); } 是一个带有“letter”类别的unicode代码点

<强>代码

{{1}}

输出

  

0
  1
  2
  5

答案 1 :(得分:0)

以下代码可以与任何正则表达式一起使用,而无需更改实际表达式:

        Regex rx = new Regex("(a)\1"); // or any other word you're looking for.

        int position = 0;
        string text = "aaaaabbbbccccaaa";
        int textLength = text.Length;

        Match m = rx.Match(text, position);

        while (m != null && m.Success)
        {
            Console.WriteLine(m.Index);

            if (m.Index <= textLength)
            {
                m = rx.Match(text, m.Index + 1);
            }
            else
            {
                m = null;
            }
        }

        Console.ReadKey();

它使用该选项更改每个连续搜索的正则表达式搜索的起始索引。实际问题来自于,默认情况下,Regex引擎将始终在上一次匹配后继续搜索。所以它永远不会在另一场比赛中找到可能的比赛,除非你通过使用预测构造或通过手动设置起始索引来指示它。

另一个相对简单的解决方案是将整个表达式放在前瞻性的前瞻中:

        string expression = "(a)\1"
        Regex rx2 = new Regex("(?=" + expression + ")");
        MatchCollection ms = rx2.Matches(text);
        var indexes = ms.Cast<Match>().Select(match => match.Index);

这样,引擎会在找到的每个匹配项中自动将索引提前一个。

From the docs

  

当通过调用NextMatch方法重复匹配尝试时,正则表达式引擎会给出空匹配特殊处理。通常,NextMatch开始搜索下一场比赛的确切位置。但是,在空匹配之后,NextMatch方法在尝试下一个匹配之前前进一个字符。此行为可确保正则表达式引擎将在字符串中前进。否则,因为空匹配不会导致任何向前移动,所以下一个匹配将在与前一个匹配完全相同的位置开始,并且它将重复匹配相同的空字符串。

答案 2 :(得分:-1)

试试这个:

How can I find repeated characters with a regex in Java?

它是在java中,但是正则表达式和非正则表达式是存在的。 C#Regex与Java方式非常相似。