正则表达式:匹配预定义标签的枚举
Regexp: match enumeration of predefined tags
我有一个术语,比方说 dog
和一组预定义标签示例:red
和 big
。我正在尝试编写一个匹配有效字符串的正则表达式 - 那些具有标签可能零次或一次的标签的任意组合的字符串。标签顺序无关紧要。
应匹配的字符串示例:
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$
正则表达式详细信息:
^
: 开始
^(?!.*\b(big|red)\h.*\b\b)
: 任何关键字出现多次则匹配失败
(?:big\h+|red\h+)*
:匹配 0 个或多个 big
或 red
后跟 1+ 个空格 的单词
dog
:匹配dog
$
:结束
我有一个术语,比方说 dog
和一组预定义标签示例:red
和 big
。我正在尝试编写一个匹配有效字符串的正则表达式 - 那些具有标签可能零次或一次的标签的任意组合的字符串。标签顺序无关紧要。
应匹配的字符串示例:
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$
正则表达式详细信息:
^
: 开始^(?!.*\b(big|red)\h.*\b\b)
: 任何关键字出现多次则匹配失败(?:big\h+|red\h+)*
:匹配 0 个或多个big
或red
后跟 1+ 个空格 的单词
dog
:匹配dog
$
:结束