Regex 用于黑名单和白名单单词的正则表达式

Regex 用于黑名单和白名单单词的正则表达式,regex,blacklist,Regex,Blacklist,我试图为黑名单和白名单设置regex,标记黑名单上的单词,忽略白名单上的单词。规则如下: 我想看看输入字符串中是否存在黑名单上的单词或短语 黑名单中的单词应该匹配,无论它们出现在哪里(完整单词或作为子字符串) 如果白名单单词(即,即使包含黑名单单词,也被认为没有问题的单词)仅为完整单词,则不进行匹配 我想搜索并匹配的黑名单单词:兔子、花园、洞 白名单上的词是干净的,可以忽略,即使它们包含黑名单上的词:整体,园丁 我使用负回溯生成了以下正则表达式: (兔子|花园|洞)( 我愚蠢的示例字符串: 这整

我试图为黑名单和白名单设置regex,标记黑名单上的单词,忽略白名单上的单词。规则如下:

  • 我想看看输入字符串中是否存在黑名单上的单词或短语
  • 黑名单中的单词应该匹配,无论它们出现在哪里(完整单词或作为子字符串)
  • 如果白名单单词(即,即使包含黑名单单词,也被认为没有问题的单词)仅为完整单词,则不进行匹配
  • 我想搜索并匹配的黑名单单词:兔子、花园、洞

    白名单上的词是干净的,可以忽略,即使它们包含黑名单上的词:整体,园丁

    我使用负回溯生成了以下正则表达式:
    (兔子|花园|洞)(

    我愚蠢的示例字符串: 这整个洞是园丁阿加登纳犯的一个大错

    我希望只有以下几点可以匹配: “洞” “哇” “阿加登纳”

    它主要起作用,因为“整体”不匹配,但“wholey”匹配,而“agardener”也匹配。然而,“gardener”匹配,即使它在白名单中。我缺少什么?

    您可以使用

    \w*(?:兔子|花园|洞)\w*\b(?)?
    看

    一种没有后视但具有前视的变体:

    \b(?(?:整个园丁)\b)\w*(?:兔子|花园|洞)\w*\b
    

    详情:

    • \w*
      -零个或多个字字符
    • (?:BUNNY | GARDEN | HOLE)
      -所需单词部分之一
    • \w*
      -零个或多个字字符
    • \b
      -单词边界
    • (?-如果左侧的整词是
      整词
      园丁
      ,则会导致匹配失败的负面查找
    \b(?((?:整型|园丁)\b)\w*(?:BUNNY | GARDEN | HOLE)\w*\b
    首先匹配单词边界,然后如果下一个字符是
    整型
    园丁
    整型单词,然后将单词与
    BUNNY
    GARDEN
    HOLE
    子字符串匹配,则匹配失败


    \w
    替换为
    [a-zA-Z]
    \p{L}
    (或
    [:alpha:][/code>),如果支持,您只需要匹配字母词。

    (\bBUNNY\b|b\bGARDEN\b|bHOLE\b)
    ?首先,您需要澄清“黑名单”的含义根据定义,如果它不在你的白名单上,它就不会匹配。那么你黑名单上的单词和两个名单上的单词有什么区别呢?如果我们可以忽略黑名单,这样的事情适合你的目的吗?
    \b(BUNNY | GARDEN | HOLE)\b
    谢谢@Charlie Armstrong的输入。我更新了问题。我试图确定输入字符串中是否存在黑名单字,但如果黑名单字是白名单字的一部分,请忽略该匹配。