对于以下条目,我想排除以_OK
结尾的字词
我找到了一个匹配以_OK
结尾的单词的正则表达式
但我想找到相反的
此RegEx匹配以_OK
\b(\w+(?:_OK))\b
输入:
SMHST_BI_V2016AUG
SMHST BI V2016AUG_OK
SMHST_BI_V2016SEP
SMHST_BI_V2016SEP_OK
答案 0 :(得分:3)
答案 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;。