正则表达式 - 按任意顺序匹配N个单词中的至少2个单词

时间:2018-02-13 02:04:48

标签: regex regex-lookarounds

我正在尝试创建一个正则表达式,如果一个字符串中至少有两个单词,则会创建一个匹配项。例如,记下单词(' one',&#39 ;两个','三个'四个')。这个正则表达式应该返回所有这些情况的匹配:

one two three four
twothreeone
two plus two is four

它不应该返回匹配:

one
three plus three is three

我尝试了类似'/^(?=.*one)(?=.*two)(?=.*three)(?=.*four).+/'的内容,但只有在字符串中包含所有单词('one', 'two', 'three', 'four')时才会匹配。

3 个答案:

答案 0 :(得分:2)

为窃取某人的评论而道歉,但它确实有效!

  

在Perl / PCRE中,您可以使用对带有(?n)的捕获组中的子模式的引用,其中n是捕获组的编号。所以:(一|二|三|四)。*(?!\ 1)(?1)。在最坏的情况下,当您知道快捷键ctrl + c和ctrl + v时,您不必输入两次所有内容 - Casimir et Hippolyte 4小时前

% pcretest 
PCRE version 8.35 2014-04-04

  re> #(one|two|three|four).*(?!\1)(?1)#
data> one one one
No match
data> one two one
 0: one two
 1: one
data> one four
 0: one four
 1: one
data> four four
No match
data> ^D
%

确实,在pcre,这是nginx(OpenBSD端口中整个nginx端口的唯一依赖项!)和许多其他软件使用的流行库,您可以使用类似{ {1}}(或(?1))引用之前的模式,因此,您不必多次复制粘贴事物,以及负面预测,这只是标准票价。

以下是有关功能的文档 - 您可能需要查看(?-1)pcrepattern手册页,如下所示:

通常,http://www.pcre.org/original/pcre.txthttp://www.pcre.org/pcre2.txt页面包含完整的文档,有助于搜索您在某处看到的语法。

答案 1 :(得分:1)

搜索目标单词的两个副本,但捕获第一个单词并使用对第一个组的反向引用对第二个单词应用否定先行,以断言第二个单词中出现不同的单词小组制作(至少)2个。

(one|two|three|four).*(?!\1)(one|two|three|four)

请参阅live demo

答案 2 :(得分:1)

(one|two|three|four).*(?!\1)(?-1)

说明:

  • 捕获小组中的一个字
  • 查找任意数量的字符
  • 如果您发现最后一组中匹配的内容不匹配
  • 除非你找到另一个匹配的第一组(递归子模式)

这意味着当您编辑它时,您将能够只编辑一个捕获组,假设您正在使用PCRE正则表达式(例如,PHP)。

查看demo