【问题标题】:How to create a bi-directional and regex?如何创建双向和正则表达式?
【发布时间】:2015-07-02 12:31:27
【问题描述】:

问题陈述:我需要创建一个正则表达式来双向匹配文本。我所说的双向的意思是我想要一个正则表达式以任何顺序匹配少数关键字的出现,即如果我说 A 双向和 B,那么它将作为 A.*BB.*A 工作。我需要一个正则表达式来做到这一点。

以三个字符串 a、b 和 c 为例进行解释,我需要一个匹配的正则表达式:“randomstring a randomstring b randomstring c”、“randomstring a randomstring c randomstring b”、“randomstring b randomstring a randomstring c ", "随机字符串 b 随机字符串 c 随机字符串 a", "随机字符串 c 随机字符串 a 随机字符串 b", "随机字符串 c 随机字符串 b 随机字符串 a"

我尝试了什么:我想出了以下两个正则表达式来解决这个问题:

  1. (A.*B|B.*A)
  2. ((?=.*A).*(?=.*B).*)

现在的问题是,如果我使用第二种方法来创建具有五个关键字的正则表达式,我会想出类似((?=.*a).*(?=.*b).*(?=.*c).*(?=.*d).*(?=.*e).*) 的东西。在较大的句子中,我得到以下异常

RecursionLimit = '_MatchingRegex._info.RecursionLimit' 引发了“System.InvalidOperationException”类型的异常 base {System.SystemException} = {"pcre16_fullinfo 中的错误,代码:-33"}。

我正在使用 .NET 版本的 PCRE 进行处理。

而且,如果我使用第一种方式,正则表达式将变得相当长且难以维护。它也可能存在性能问题,因为正则表达式引擎的性能也取决于正则表达式的长度。

现在,我正在寻找关于什么是适合您的最佳方法以及是否有任何其他方法可以实现此正则表达式的见解。请注意,我必须为此编写一个正则表达式,并且我不能只搜索较大文本中出现的子字符串(使用包含或类似方法)。

【问题讨论】:

    标签: regex pcre regex-lookarounds regex-greedy


    【解决方案1】:

    以三个字符串 a、b 和 c 为例进行解释,我需要一个匹配的正则表达式:“abc”、“acb”、“bac”、“bca”、“cab”、“cba”

    ^(?=.*?a)(?=.*?b)(?=.*?c)[abc]{3}$
    

    DEMO

    【讨论】:

    • 嗨,阿维纳什,很抱歉造成混乱。我已经编辑了测试用例。变化是在 a、b 和 c 之间可以发生任何事情,但是顺序无关紧要。
    • 然后这个^(?=.*?a)(?=.*?b)(?=.*?c).*[abc].*[abc].*[abc].*$
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 2022-12-05
    • 2015-03-24
    相关资源
    最近更新 更多