正则表达式以排除以_OK结尾的Word

时间:2016-10-17 12:40:45

标签: regex

对于以下条目,我想排除以_OK结尾的字词 我找到了一个匹配以_OK结尾的单词的正则表达式 但我想找到相反的

此RegEx匹配以_OK

结尾的单词
\b(\w+(?:_OK))\b

输入:

SMHST_BI_V2016AUG
SMHST BI V2016AUG_OK
SMHST_BI_V2016SEP
SMHST_BI_V2016SEP_OK

3 个答案:

答案 0 :(得分:3)

您可以使用:

\b\w+(?<!_OK)\b

Live demo

根据Wiktor的建议,您可以使+占有欲更快。

另外,请注意,大多数情况下,这种通用请求可以通过简单的!Contains()来处理

答案 1 :(得分:2)

有两种方式。

使用否定前瞻(demo):

\b(?!\w*_OK\b)\w+\b

或负面的背后:

\b\w+\b(?<!_OK)

请参阅another demo

第一个选项适用于大多数NFA正则表达式引擎(例如PCRE,JavaScript,Python,.NET,Java,Oniguruma / Onigmo,ICU),而第二个选项只能用于支持lookbehinds的那些(.NET) ,PCRE,Python,Java,ICU,Oniguruma / Onigmo)。请注意,在RE2和Go中,根本不支持外观。

详细

  • \b - 领先的单词边界
  • (?!\w*_OK\b) - 如果在当前位置之后有0个字符字符后面跟着_OK后跟一个字边界<= li>,则表示匹配失败的否定前瞻
  • \w+ - 一个或多个单词字符后跟
  • \b - 一个尾随字边界。

\b\w+\b(?<!_OK)模式类似,但(?<!_OK)负后看仅在匹配整个单词后触发一次,如果在_OK之前存在\w+字符序列,则匹配失败当前位置(即与<fo:block-container min-height="4cm"> <fo:block background-color="blue">Foobar</fo:block> </fo:block-container> 匹配的单词之后的尾随字边界。)

答案 2 :(得分:0)

&#34;前瞻&#34;和/或&#34; lookbehind&#34;从正则表达式中执行此操作所需的功能并不总是可用。相反,您可以反转外部控制逻辑,仅处理匹配的行。例如,在Perl中你会写

while (<>) {
    chomp;
    next if /_OK$/;
    # if we get here, $_ does _not_ end in "_OK"
}

或者,从shell提示符

grep -v '_OK$' < file_to_process | further_steps

正如您所看到的,此技术还可以让您使用更简单的正则表达式。

(Perl正则表达式确实具有前瞻/外观;我只是使用它,因为它非常方便地表示&#34;外部控制逻辑&#34;。

相关问题