如何在 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
。我怎样才能让它匹配一开始的所有a
s?
我试过了
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);
我不能让a
s 被非后视组匹配到我。这样,表达式将只匹配b
重复后面的a
重复。
匹配aaabbbb
产生bbbb
,匹配aaabbbbcccbbbbaaaaaabbzzabbb
产生bbbbcccbbbb
、bbzz
和bbb
。
【讨论】:
【参考方案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 并返回值数组