Regex 排除以_OK结尾的单词的正则表达式
对于以下条目,我想排除以Regex 排除以_OK结尾的单词的正则表达式,regex,Regex,对于以下条目,我想排除以\u OK 我找到了一个正则表达式,它匹配以\u OK 但我想找到相反的结果 此正则表达式匹配以\u OK \b(\w+(?:_OK))\b 投入: SMHST_BI_V2016AUG SMHST BI V2016AUG_OK SMHST_BI_V2016SEP SMHST_BI_V2016SEP_OK 有两种方法 使用负前瞻(): 或者消极的回顾: \b\w+\b(?<!_OK) \b\w+\b(?)? 看 第一个选项适用于大多数NFA正则表达式引擎(例如P
\u OK
我找到了一个正则表达式,它匹配以\u OK
但我想找到相反的结果
此正则表达式匹配以\u OK
\b(\w+(?:_OK))\b
投入:
SMHST_BI_V2016AUG
SMHST BI V2016AUG_OK
SMHST_BI_V2016SEP
SMHST_BI_V2016SEP_OK
有两种方法
使用负前瞻():
或者消极的回顾:
\b\w+\b(?<!_OK)
\b\w+\b(?)?
看
第一个选项适用于大多数NFA正则表达式引擎(例如PCRE、JavaScript、Python、.NET、Java、Oniguruma/Onigom、ICU),而第二个选项只能用于支持lookbehinds的引擎(.NET、PCRE、Python、Java、ICU、Oniguruma/Onigom)。请注意,在RE2和Go中,lookarounds根本不受支持
详情:
\b
-前导词边界
(?!\w*\u OK\b)
-如果当前位置后有0多个单词字符,后跟\u OK
和单词边界,则会导致匹配失败
\w+
-1个或多个单词字符后跟
\b
-尾随词边界
\b\w+\b(?模式类似,但(?反向查找仅在匹配整个单词后触发一次,如果当前位置前有\u OK
字符序列(即与\w+
匹配的单词后的尾随单词边界),则匹配失败。您可以使用:
\b\w+(?<!_OK)\b
\b\w+(?
正如Wiktor所建议的,为了更快,您可以将+
设为所有格
另外,请注意,大多数情况下,此类一般请求可以通过简单的!Contains()
处理,即“向前看”和/或“向后看”从正则表达式中执行此操作所需的功能并不总是可用的。相反,您可以反转外部控制逻辑,只处理不匹配的行。例如,在Perl中,您可以编写
while (<>) {
chomp;
next if /_OK$/;
# if we get here, $_ does _not_ end in "_OK"
}
while(){
咀嚼;
下一个if/_OK$/;
#如果我们到了这里,$不会以“\u OK”结尾
}
或者,从shell提示符
grep -v '_OK$' < file_to_process | further_steps
grep-v'_OK$'
如您所见,此技术还允许您使用更简单的正则表达式
(Perl正则表达式确实有lookahead/lookahead;我之所以使用它,是因为它非常方便地表示了“外部控制逻辑”。这可能在正则表达式中实现,也可能不实现,这取决于您使用的库或编程语言(您需要“负lookahead”,它并不总是可用)。但是,您当然可以使用您拥有的正则表达式,然后从控制代码中处理所有不匹配的行。这有意义吗?另外,SMHST BI V2016AUG_OK
是一个拼写错误,还是您希望将SMHST
和BI
视为有效匹配?再一次,您更快了;做得好!我们之间有什么区别吗你的lookback和我的一样吗?我发表了一篇关于如何使你的模式更快的评论。通过这种方法,我会使用\b\w++(?,所有格量词将使正则表达式引擎在不使用回溯选项的情况下获取单词字符,\u OK
仅在匹配这些单词字符后检查一次。@WiktorStribiżew我已经测试过了,速度似乎快了两倍!谢谢:)是的,请记住,一些支持lookehinds的引擎(例如Pythonre
)不支持所有格量词。这就是为什么lookahead版本更适合跨引擎兼容的原因。我不会在匹配结束时使用负lookahead!请添加关于哪些正则表达式引擎支持(?和++
,尽管如此,反向查找肯定不是通用的,我以前从未听说过++
。
grep -v '_OK$' < file_to_process | further_steps