代码之家  ›  专栏  ›  技术社区  ›  luvieere

如何在C_regex中使用lookback来跳过重复前缀模式的匹配?

  •  6
  • luvieere  · 技术社区  · 14 年前

    如何在C_regex中使用lookback来跳过重复前缀模式的匹配?

    示例-我试图让表达式与 b 任何数字后面的字符 a 字符:

    Regex expression = new Regex("(?<=a).*");
    
    foreach (Match result in expression.Matches("aaabbbb"))
      MessageBox.Show(result.Value);
    

    退货 aabbbb ,lookback只匹配 . 我怎么做才能和所有的 S在开始?

    我试过了

    Regex expression = new Regex("(?<=a+).*");
    

    Regex expression = new Regex("(?<=a)+.*");
    

    没有结果…

    我期待的是 bbbb .

    3 回复  |  直到 14 年前
        1
  •  7
  •   John Gietzen    14 年前

    你在寻找一个重复的捕获组吗?

    (.)\1*
    

    这将返回两个匹配项。

    鉴于:

    aaabbbb
    

    这将导致:

    aaa
    bbbb
    

    这是:

    (?<=(.))(?!\1).*
    

    使用上述原则,首先检查查找前一个字符,将其捕获到后一个引用中,然后断言该字符不是下一个字符。

    符合以下条件:

    bbbb
    
        2
  •  4
  •   luvieere    14 年前

    我终于明白了:

    Regex expression = new Regex("(?<=a+)[^a]+");
    
    foreach (Match result in expression.Matches(@"aaabbbb"))
       MessageBox.Show(result.Value);
    

    我不能允许 a 与我匹配的是无后视组。这样,表达式将只匹配那些 b 接下来的重复 重复。

    匹配 aaabbbb 产量 bbbb 和匹配 aaabbbbcccbbbbaaaaaabbzzabbb 结果 bbbbcccbbbb , bbzz bbb .

        3
  •  1
  •   Ahmad Mageed    14 年前

    之所以忽略“A”,是因为它正在消耗第一个“A”(但没有捕获它),然后捕获其余的。

    这个模式对你有用吗?新模式: \ba+(.+)\b 它使用单词边界 \b 锚定词的两端它至少匹配一个“a”,后跟其余字符,直到单词边界结束。其余的字符将捕获在一个组中,这样您就可以轻松地引用它们。

    string pattern = @"\ba+(.+)\b";
    
    foreach (Match m in Regex.Matches("aaabbbb", pattern))
    {
        Console.WriteLine("Match: " + m.Value);
        Console.WriteLine("Group capture: " + m.Groups[1].Value);
    }
    

    更新: 如果要跳过 任何 复制字母,然后匹配字符串的其余部分,可以这样做:

    string pattern = @"\b(.)(\1)*(?<Content>.+)\b";
    
    foreach (Match m in Regex.Matches("aaabbbb", pattern))
    {
        Console.WriteLine("Match: " + m.Value);
        Console.WriteLine("Group capture: " + m.Groups["Content"].Value);
    }