我正试图为黑名单和白名单设置正则表达式,标记黑名单上的单词,忽略白名单上的单词。以下是规则:
黑名单上的单词,我想搜索和匹配,如果发现:兔子,花园,洞
白名单上的单词是干净的,可以忽略,即使它们包含黑名单上的单词:整个,园丁
我使用负lookbehind做了以下正则表达式:(BUNNY|GARDEN|HOLE)(?<!\bWHOLE\b|\bGARDENER\b)
我愚蠢的例子:这整个洞是园丁的一个完整的错误。
我认为只有以下几点是匹配的:“洞”“整体”“阿加登纳”
它主要起作用,因为“整体”不匹配,而“整体”是匹配的,“整体”也是匹配的。然而,“园丁”的匹配,即使是在白名单。我遗漏了什么?
发布于 2021-02-01 21:54:30
您可以使用
\w*(?:BUNNY|GARDEN|HOLE)\w*\b(?<!\bWHOLE|\bGARDENER)
见regex演示。
一种没有回头看,但具有前瞻性的变体:
\b(?!(?:WHOLE|GARDENER)\b)\w*(?:BUNNY|GARDEN|HOLE)\w*\b
详细信息
\w*
-零或多个单词字符(?:BUNNY|GARDEN|HOLE)
-必要的单词部分之一\w*
-零或多个单词字符\b
-一个单词边界(?<!\bWHOLE|\bGARDENER)
-如果位于左侧的整个单词是WHOLE
或GARDENER
,则负面查找将使匹配失败。\b(?!(?:WHOLE|GARDENER)\b)\w*(?:BUNNY|GARDEN|HOLE)\w*\b
首先匹配单词边界,然后如果下一个字符是WHOLE
或GARDENER
整体单词,则匹配失败,然后匹配包含BUNNY
、GARDEN
或HOLE
子字符串的单词。
将\w
替换为[a-zA-Z]
或\p{L}
(或[[:alpha:]]
) (如果支持的话),并且只需要匹配字母单词。
https://stackoverflow.com/questions/66000286
复制相似问题