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

Regular expression: match at least *two* of a given list of strings or patterns?

假设我定义了一个颜色列表。我可以使用如下正则表达式检查这些颜色中是否至少有一种出现在字符串中:

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

是否也可以制作一个正则表达式模式来检查是否至少有两种上述颜色出现?

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

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

但是有没有更复杂的方法,最好是 'regex only'?

捕获一组中的第一种颜色,然后在匹配第二种颜色之前,对第一种匹配颜色的反向引用进行负先行:

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

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

或者,如果你的引擎可以递归一个先前的组,它可以写得更干:

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

您可以通过在组中捕获它们来继续其他颜色的模式,并对之前匹配的所有组使用负先行:

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

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