正则表达式查找所有匹配项,除了那些被字符包围的匹配项

Posted

技术标签:

【中文标题】正则表达式查找所有匹配项,除了那些被字符包围的匹配项【英文标题】:Regex find all matches EXCEPT those surrounded by characters 【发布时间】:2021-09-08 23:47:35 【问题描述】:

我有以下正则表达式来查找我的字符串中的所有 word 实例。在以下字符串中,这(正确)匹配 eeid 和 catalog:

表达式 ([^:]*?)

正在搜索的字符串 ?:participants::lookup(.,eeid,catalog)

现在 - 我需要“转义”其中一个值,因此它不会被匹配/替换。我正在尝试使用方括号来这样做:

?:participants::lookup(.,eeid,[[catalog]])

如何调整我的正则表达式使其忽略 catalog(包含在 [[ ]] 中)但找到 eeid?

【问题讨论】:

尝试:(?<!\[\[(?:(?!\[\[|]]).)*)([^]*)(?!(?:(?!\[\[|]]).)*]]) 假设 [[]] 并不总是与 ... 相邻 它们总是相邻的。我想保留(不匹配)任何类似 [[...]] 在这种情况下使用(?<!\[\[)([^]*)(?!]]) 那行得通...我实际上不得不在表达式中添加另一个位,[^:](我也不想匹配有冒号的地方:)(?<!\[\[)([^:]*)(?!]]) 是我最终得到了什么。似乎工作!谢谢! 【参考方案1】:

你可以使用

(?<!\[\[)\([^:]*)(?!]])

请参阅.NET regex demo。

详情

(?&lt;!\[\[) - 如果在当前位置的左侧紧邻 [[,则匹配失败 \ - 一个 字符 ([^:]*) - 第 1 组:除 : 之外的任何零个或多个字符 - 一个 字符 (?!]]) - 如果在当前位置的右侧有 ]],则匹配失败。

见C# demo:

var s = "?:participants::lookup(.,eeid,[[catalog]])";
var rx = @"(?<!\[\[)\([^:]*)(?!]])";
var res = Regex.Matches(s, rx).Cast<Match>().Select(x => x.Groups[1].Value);
foreach (var t in res)
    Console.WriteLine(t);

// => eeid

【讨论】:

很好的解释和示例 - 标记为答案,尽管 @anubhava 在 cmets 中已经回答了原始问题。

以上是关于正则表达式查找所有匹配项,除了那些被字符包围的匹配项的主要内容,如果未能解决你的问题,请参考以下文章

当两边都被某个字符串包围时试图排除匹配

如何使用正则表达式查找具有特定起始字符串的所有匹配项? [复制]

查找所有正则表达式匹配的索引?

使用正则表达式查找两个字符串之间的多个匹配项

正则表达式中的重叠匹配

从 pandas 数据框列中查找所有正则表达式匹配项