正则表达式:匹配预定义标签的枚举

Regexp: match enumeration of predefined tags

我有一个术语,比方说 dog 和一组预定义标签示例:redbig。我正在尝试编写一个匹配有效字符串的正则表达式 - 那些具有标签可能零次或一次的标签的任意组合的字符串。标签顺序无关紧要。

应匹配的字符串示例:

dog
red dog
red big dog
big red dog

不应匹配的字符串示例:

red red dog
red big red dog
small red dog

直接枚举所有可能的组合的方法是一个有几十个术语的噩梦。

这是我暂时停止的地方:

/
    (?:                       # group for repetition
        (
            red\s | big\s     # a tag that ...
        )(?!  )             # ... is not followed by itself
                              # > (replacing backref with a recusional backref
                              # > still doesn't work, 
                              # > changing negative lookahead by a positive
                              # > still gives same undesired match on invalid strings)


    ){0,2}                    # such a term repeated 0 to [amount of terms] times
    dog                       # followed by a 'dog'
/xs

此正则表达式匹配所有字符串,这是不需要的。

您可以使用这个正则表达式:

^(?!.*\b(big|red)\h.*\b\b)(?:big\h+|red\h+)*dog$

RegEx Demo

正则表达式详细信息:

  • ^: 开始
  • ^(?!.*\b(big|red)\h.*\b\b): 任何关键字出现多次则匹配失败
  • (?:big\h+|red\h+)*:匹配 0 个或多个 bigred 后跟 1+ 个空格
  • 的单词
  • dog:匹配dog
  • $:结束