避免提取具有特定术语的单词

Avoid extracting a word with a specific term

我的计划是使用正则表达式从字符串中提取词组。但是,我有时会在应该提取的单词前面加上 NOT 这个单词。不确定如何处理该问题。

测试字符串:

tag=os index=linux index=windows NOT index=mac tag=db index="a_something-else" NOT   index=solaris

当前(失败)正则表达式:

index=(\")?(?<my_indexes>\w+(-)?(\w+)?)(\")?

此正则表达式正在提取所有 index=zyx 个单词。但是 NOT 的情况例如NOT index=macNOT index=solaris 应该避免。例如。结果应该是这样的:

index=linux
index=windows
index="a_something-else"

有什么建议吗?

如您所指,它是 PCRE,一种选择是使用 SKIP FAIL 模式,并使用带有反向引用的捕获组来配对匹配的双引号。

然后你可以在捕获组中使双引号可选,并使用 </code> 和 <code>

引用它

请注意,您不必自行转义双引号。

\bNOT\h+index=("?)\w+(?:-\w+)*(*SKIP)(*FAIL)|index=("?)\w+(?:-\w+)*

说明

  • \bNOT\h+ 匹配 NOT 和 1+ 个水平空白字符
  • index=("?) 匹配 index= 并在 组 1
  • 中捕获一个可选的 "
  • \w+(?:-\w+)* 匹配 1+ 个单词字符,可选择由 - 和 1+ 个单词字符重复。然后反向引用组 1
  • 中捕获的内容
  • (*SKIP)(*FAIL)| 跳过比赛
  • index=("?) 匹配 index= 并在 组 2
  • 中捕获一个可选的 "
  • \w+(?:-\w+)* 与上面的模式相同,现在反向引用组 2

Regex demo

如果您不想要 a_something-else 周围的双引号并且只想要 = 之后的值,您可以使用另一个捕获组,或者使用命名的捕获组 my_indexes

\bNOT\h+index=("?)\w+(?:-\w+)*(*SKIP)(*FAIL)|index=("?)(?<my_indexes>\w+(?:-\w+)*)

Regex demo