正则表达式:至少匹配给定字符串或模式列表中的*两个*?

时间:2019-06-16 22:01:54

标签: regex string pattern-matching preg-match

假设我已经定义了颜色列表。我可以检查是否至少有一种颜色出现在带有正则表达式的字符串中,如下所示:

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent)

是否还可以制作正则表达式模式以检查是否至少有两种颜色出现了上述

(不是:同一颜色不止一次,但实际上是两种不同颜色,即图案列表中的两种不同匹配项)

我可以想到一些技巧来实现此目的,例如:找到第一个匹配项,删除该匹配项的所有实例(即用空字符串或其他内容搜索/替换它),然后再次执行正则表达式检查。如果再次匹配,我知道还有第二种颜色。

但是有没有更复杂的方法,最好是“仅使用正则表达式”?

1 个答案:

答案 0 :(得分:1)

捕获组中的第一种颜色,然后紧跟在匹配第二种颜色之前,使用负向超前查找以反向引用所匹配的第一种颜色:

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent).*(?!\1)(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent)

https://regex101.com/r/ubR2HF/1

或者,如果您的引擎可以递归先前的组,则可以将其写为DRY:

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent).*(?!\1)(?1)

您可以继续捕获其他颜色,方法是将它们成组捕获,并对先前匹配的所有组使用负前瞻:

(red|orange|yellow|green|cyan|blue|magenta|white|gray|black|transparent).*(?!\1)((?1)).*(?!\1|\2)(?1)

https://regex101.com/r/ubR2HF/2