正则表达式查找所有匹配项,除了那些被字符包围的匹配项
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。
详情
(?<!\[\[)
- 如果在当前位置的左侧紧邻 [[
,则匹配失败
\
- 一个
字符
([^:]*)
- 第 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 中已经回答了原始问题。以上是关于正则表达式查找所有匹配项,除了那些被字符包围的匹配项的主要内容,如果未能解决你的问题,请参考以下文章