Regex 与列表中至少两个单词匹配的正则表达式

Regex 与列表中至少两个单词匹配的正则表达式,regex,language-agnostic,Regex,Language Agnostic,我有一个单词列表-“foo”,“bar”,“baz”,我想写一个regexp,它将匹配至少包含两个单词的字符串。例如,“foo baz”应该匹配,而“ba foo z”不应该匹配 显而易见的解决方案“(foo | bar | baz)。*(foo | bar | baz)是有效的,但我发现它不令人满意,因为它列出了两次单词。如果我有25个单词而不是3个呢?如果我正在寻找至少包含4个给定单词而不是2个单词的字符串,该怎么办 我认为这个解决方案应该有效: "(foo|bar|baz).*\s+\1(

我有一个单词列表-
“foo”
“bar”
“baz”
,我想写一个regexp,它将匹配至少包含两个单词的字符串。例如,
“foo baz”
应该匹配,而
“ba foo z”
不应该匹配


显而易见的解决方案
“(foo | bar | baz)。*(foo | bar | baz)
是有效的,但我发现它不令人满意,因为它列出了两次单词。如果我有25个单词而不是3个呢?如果我正在寻找至少包含4个给定单词而不是2个单词的字符串,该怎么办

我认为这个解决方案应该有效:

"(foo|bar|baz).*\s+\1(\s+|$)"

\s
意味着需要一个空格字符来确保您找到的是准确的单词,而不仅仅是前缀。例如,
“foo…fooo”
无法识别。

听起来您并不是在寻找确切的单词,所以驴子的解决方案可能不是您想要的

((foo|bar|baz).*?){2}
它在文本中搜索这些字符串中的任何一个,然后搜索任何字符,直到再次找到其中一个可选字符串为止。由于懒惰的任何字符部分都将通过不匹配任何内容来完成,因此匹配就完成了


如果要在多行上匹配,请确保启用“全部点”,或使用\s\s而不是“点”。

我认为这将匹配“foo foo”而不是“foo bar”谢谢,这是我自提出问题以来想到的,只是我认为您不需要“?”您可能需要。如果没有它,愚人节就是一场比赛。有了它,傻瓜拉布拉巴就是一对,巴扎斯达斯巴里斯就是另一对。允许吗?@M42:很好的问题。我看到的所有解决方案都接受它,但我想知道是否有办法排除它。。。