正则表达式,用于匹配列表中包含两个不同单词的所有字符串

时间:2019-02-11 07:36:03

标签: java regex

我需要一个正则表达式(在Java中),当且仅当该字符串包含给定列表中的两个不同个单词时,才能匹配该字符串。

例如,如果单词列表为{blue,yellow,pink},则字符串“ blue and pink”和“ yellow is the new blue”将匹配,但是字符串“ I like blue”将不匹配(列表中仅出现一个单词),字符串“我的粉红色衬衫太粉红色”也不会出现(它不包含两个或多个不同的单词,但相同的单词两次)。

最接近我想要的正则表达式的是:

(.(blue|yellow|pink).){2}

此正则表达式将匹配包含列表中两个或两个以上单词的任何字符串,但是即使两个单词相同(例如“我的粉红色衬衫太粉红色”示例),也会匹配该字符串。

谢谢!

3 个答案:

答案 0 :(得分:3)

在捕获了初始单词之后,在匹配第二个颜色词交替之前,立即对第一个捕获组重复字符和负向查找:

.*(blue|yellow|pink).*(?!\1)(blue|yellow|pink).*

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

答案 1 :(得分:1)

您可以先行完成两次

^(?=.*blue)(?=.*pink).+$

但是您需要先以编程方式指定单词。参见a demo on regex101.com

答案 2 :(得分:1)

您可以使用正向前瞻和带有锚点的捕获组来断言字符串的开始和结尾,并使用带有反向引用的捕获组来断言右边的内容不是已经捕获的内容

^(?=.*(blue|yellow|pink).*(?!\1)(blue|yellow|pink)).*$

regex101上的演示