【问题标题】:Regex find all matches EXCEPT those surrounded by characters正则表达式查找所有匹配项,除了那些被字符包围的匹配项
【发布时间】:2023-03-25 19:58:01
【问题描述】:

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

表达式 {([^:]*?)}

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

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

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

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

【问题讨论】:

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

标签: c# regex


【解决方案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 中已经回答了原始问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-26
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多