正则表达式 - 如何查找一行在行中的顺序无关紧要的项目

时间:2016-07-21 19:50:38

标签: regex pcre

让我们说我正在寻找一系列包含abc项目的文字及其排序顺序它们出现时可能会有所不同。

使用与Perl兼容的正则表达式,是否有"功能"这可以为您提供一个正则表达式来检测abc出现在行中某个位置不相关的行?

如果没有这样的功能,您将拥有“{1}}表达式”,N!是唯一项目的数量。

N

我会选择能够生成正则表达式的在线工具。

注意:这个问题是语言不可知的,即单行正则表达式。 但是,如果所需的功能不是Perl兼容的正则表达式的本机,则可能需要使用Python或Perl等语言。

更新1

提出问题:如果regex = (.*a.*b.*c.*)|(.*a.*c.*b.*)|(.*b.*c.*a.*)|(.*b.*a.*c.*)|(.*c.*a.*b.*)|(.*c.*b.*a.*) abcmesssag重叠,会怎样?

是否应该构造正则表达式以使重叠的单词失败或成功搜索?

3 个答案:

答案 0 :(得分:3)

您不需要那些不必要的管道,因为您只需从前瞻中受益:

(?=.*?a)(?=.*?b)(?=.*?c)

答案 1 :(得分:1)

不要试图将所有内容塞入单个正则表达式模式中。你正在使用Perl,所以使用Perl!

/a/ and /b/ and /c/

将完全按照您的要求执行

答案 2 :(得分:0)

使用pcre / perl正则表达式进行无序解析 无需排列。

(?:.*?(?:(?(1)(?!))(a)|(?(2)(?!))(b)|(?(3)(?!))(c))){3}

扩展

 (?:
      .*? 
      (?:
           (?(1)
                (?!)
           )
           ( a )                         # (1)
        |  
           (?(2)
                (?!)
           )
           ( b )                         # (2)
        |  
           (?(3)
                (?!)
           )
           ( c )                         # (3)
      )
 ){3}

只需添加所需数量即可 如果您需要10个中的5个,只需更改范围量词 在{5,10}的外部范围内。