为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2022-06-15 09:48:21
当且仅当它包含给定列表中的两个不同单词时,我需要一个匹配字符串的正则表达式(在 Java 中) 。例如,如果单词列表是{blue,yellow,pink},那么字符串“blue and pink”和“yellow is the new blue”会匹配,但字符串“I like blue”不会匹配(只有一个单词从列表中出现),字符串“我的粉色衬衫太粉红色”也不会出现(它不包含两个或多个不同的词,但同一个词两次)。最接近我想要的正则表达式的是:(.(blue|yellow|pink).){2}此正则表达式将匹配包含列表中两个或多个单词的任何字符串,但即使这两个单词相同,它也会匹配(如“我的粉红色衬衫非常粉红色”示例中)。谢谢!!
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

捕获初始单词后,在匹配第二个颜色词交替之前,为第一个捕获组重复字符和负前瞻:

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

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


查看完整回答
反对 回复 2022-06-15
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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

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

正则表达式 101上的演示


查看完整回答
反对 回复 2022-06-15
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

你可以用两个前瞻来做到这一点

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

但是您需要在之前以编程方式指定单词。在 regex101.com 上查看演示


查看完整回答
反对 回复 2022-06-15
  • 3 回答
  • 0 关注
  • 601 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信