首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个部分依赖于另一个正则表达式的结果的条件正则表达式

一个部分依赖于另一个正则表达式的结果的条件正则表达式
EN

Stack Overflow用户
提问于 2017-09-10 17:42:45
回答 3查看 343关注 0票数 2

是否有可能设计正则表达式,使其一部分依赖于同一正则表达式的另一部分?

请考虑以下示例:

(ABCHEHG)[HGE]{5,1230}(EEJOPK)[DM]{5}

我想继续这个正则表达式,在某些时候,我将有一个部分,该节的结果应该依赖于DM{5}的结果。

例如,D将由C补充,M将由N补充。

(ABCHEHG)HGHE{5,1230}(EEJOPK)DM{5}ACF{1,1000}(BBBA)CU{2,5}D'M'{5}

D指的是C,M是N。

因此,一个与上述正则表达式相匹配的结果字符串,如果它与DM{5}部分具有DDDMM匹配,则必须有与D‘’{5}匹配的CCCNN。因此,D‘’{5}的结果总是取决于DM{5},或者换句话说,与DM{5}的匹配总是决定什么将与D‘{5}匹配。

有可能用regex做这样的事吗?

请注意,在这个例子中,我把问题过于简化了.我目前使用的regex模式实际上更复杂、更长,而我的实际模式包括大约5-6个依赖的sections.

EN

回答 3

Stack Overflow用户

发布于 2017-09-10 18:07:15

这听起来像是蟒蛇的生物信息学。在正则级和应用级进行两阶段过滤.

通配符DM部分,因此regex在它所接受的内容上是允许的。将正则表达式隐藏在yield的几个匹配部分的令牌生成器中。让应用程序迭代生成器的结果,丢弃任何被业务逻辑拒绝的结果,例如发现一个令牌不是另一个令牌的补充。

或者,您可以将其中一些工作推入一个复杂的生成regex中,这可能会执行更糟糕的操作,并且更难调试。您的DDDMM示例可以概括为D+M+或DM+,不确定序列是否重要。补语可能是C+N+,或CN+。很明显这里有两个案子。所以开始组装一个regex: stuff1 DM+ stuff2 CN+ stuff3。然后点击‘\’来进行交替,然后点击另一个例子: stuff1 CN+ stuff2 DM+ stuff3 (或者把后缀和前缀加进去,以便在stuff1之后开始交替)。我无法想象你会满意这种方法,因为组合学变得丑陋,正则表达式引擎被迫做大量的扫描和回溯。而且,重新编译额外的正则表达式并不是免费的。相反,您应该将regex引擎用于它擅长的简单事情,并将复杂的业务逻辑决策委托给您的应用程序。

票数 0
EN

Stack Overflow用户

发布于 2017-09-10 18:09:09

我想不出你能用纯正则表达式做这件事。我会运行两个正则表达式。提取DM{5}字符串的第一个正则表达式,如

(ABCHEHG)[HGHE]{5,1230}(EEJOPK)[DM]{5}

然后取最后5个字符。现在替换字符,例如在C#中,它将是result = result.Substring(result.Length - 5, 5).Replace('D', 'C').Replace('M', 'N'),然后连接如下

(ABCHEHG)[HGHE]{5,1230}(EEJOPK)[DM]{5}[ACF]{1,1000}(BBBA)[CU]{2,5} + result

票数 0
EN

Stack Overflow用户

发布于 2017-09-10 18:25:42

这在Perl中非常容易实现:

代码语言:javascript
复制
m{
    ABCHEHG
    [HGHE]{5,1230}
    EEJOPK
    ( [DM]{5} )
    [ACF]{1,1000}
    BBBA
    [CU]{2,5}
    (??{ $1 =~ tr/DM/CN/r })
}x

为了提高可读性,我添加了x修饰符和空格。我还移除了固定字符串周围的捕获组(它们是固定字符串,您已经知道它们将捕获什么)。

关键部分是捕获[DM]{5} (在$1中)实际匹配的字符串,然后在结束时使用该字符串动态生成子模式,方法是将所有D替换为C,将M替换为$1中的N

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46143708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档