如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?

Posted

技术标签:

【中文标题】如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?【英文标题】:How can I use lookbehind in a C# Regex in order to skip matches of repeated prefix patterns? 【发布时间】:2010-10-01 13:39:23 【问题描述】:

如何在 C# 正则表达式中使用lookbehind 来跳过重复前缀模式的匹配?

示例 - 我试图让表达式匹配任意数量的 a 字符之后的所有 b 字符:

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

foreach (Match result in expression.Matches("aaabbbb"))
  MessageBox.Show(result.Value);

返回aabbbb,后向仅匹配a。我怎样才能让它匹配一开始的所有as?

我试过了

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

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

没有结果...

我期待的是bbbb

【问题讨论】:

您的预期结果是什么? 【参考方案1】:

您是否在寻找重复捕获组?

(.)\1*

这将返回两个匹配项。

给定:

aaabbbb

这将导致:

aaa
bbbb

这个:

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

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

匹配:

bbbb

【讨论】:

我需要后向组来匹配所有 a 字符。即实际匹配的是bbbb,因为重复a的组应该被忽略。 @luvieere:我已经做出了改变。【参考方案2】:

我终于明白了:

Regex expression = new Regex("(?<=a+)[^a]+");

foreach (Match result in expression.Matches(@"aaabbbb"))
   MessageBox.Show(result.Value);

我不能让as 被非后视组匹配到我。这样,表达式将只匹配b 重复后面的a 重复。

匹配aaabbbb 产生bbbb,匹配aaabbbbcccbbbbaaaaaabbzzabbb 产生bbbbcccbbbbbbzzbbb

【讨论】:

【参考方案3】:

look-behind 跳过“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);

【讨论】:

在你的正则表达式中不要有'b'或'a'。 @John 谢谢我特别关注字母“a”。我的第二个示例适用于任何重复的字符且无需对其进行硬编码。 好吧,+1,我认为我的更简洁一些,但看起来更容易阅读。

以上是关于如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?

如何使用 regex.match 在 c# 中提取字符串的特定部分? [复制]

如何使用 regex.split 在 c# 中解析 html 并返回值数组

如何在 Java 中获取 Group.Captures(来自 C# 中的 RegEx)的行为?

C# Regex - 如何从字符串中删除多个成对的括号

如何在 C# 中与 Regex Class 匹配我部分知道的字符串?