Regex 条件正则表达式,其中一节依赖于正则表达式另一节的结果

Regex 条件正则表达式,其中一节依赖于正则表达式另一节的结果,regex,Regex,是否可以设计一个正则表达式,使其一部分依赖于同一正则表达式的另一部分 考虑以下示例: (ABCHEHG)[HGE]{51230}(EEJOPK)[DM]{5} 我想继续这个正则表达式,在某个时刻,我将有一个部分,该部分的结果应该取决于[DM]{5}的结果 例如,D将由C补充,M将由N补充 (ABCHEHG)[HGHE]{51230}(EEJOPK)[DM]{5}[ACF]{11000}(BBBA)[CU]{2,5}[D'M']{5} D是指C,M是指N 因此,匹配上述正则表达式的结果字符串,如果

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

考虑以下示例:

(ABCHEHG)[HGE]{51230}(EEJOPK)[DM]{5}

我想继续这个正则表达式,在某个时刻,我将有一个部分,该部分的结果应该取决于[DM]{5}的结果

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

(ABCHEHG)[HGHE]{51230}(EEJOPK)[DM]{5}[ACF]{11000}(BBBA)[CU]{2,5}[D'M']{5}

D是指C,M是指N

因此,匹配上述正则表达式的结果字符串,如果它有与[DM]{5}节匹配的DDDMM,那么它必须有与[D'M']{5}节匹配的CCCNN。因此,[D'M']{5}的结果总是取决于[DM]{5},或者换句话说,与[DM]{5}匹配的内容总是决定与[D'M']{5}匹配的内容

有可能用正则表达式做这样的事情吗


请注意,在这个例子中,我过度简化了这个问题。我目前使用的正则表达式模式实际上要复杂得多,而且更长,我的实际模式包括大约5-6个这样的依赖部分。

这听起来像python中的生物信息学。在正则表达式级别和应用程序级别执行两级过滤

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


或者,您可以将其中的一些工作下推到一个复杂的生成正则表达式中,这可能会执行得更差,并且更难调试。您的DDDMM示例可能总结为D+M+,或[DM]+,不确定顺序是否重要。补码可能是C+N+,或[CN]+。显然这里有两个案子。因此,开始组装一个正则表达式:stuff1[DM]+stuff2[CN]+stuff3。然后加上“|”作为替换,再加上另一个大小写:stuff1[CN]+stuff2[DM]+stuff3(或者去掉后缀和前缀,使替换在stuff1之后开始)。我无法想象你会对这种方法感到满意,因为组合运算变得丑陋,正则表达式引擎被迫进行大量扫描和回溯。而且动态地重新编译额外的正则表达式并不是免费的。相反,你应该使用regex引擎处理它擅长的简单事情,并将复杂的业务逻辑决策委托给你的应用程序。

我想不出一种方法可以在纯regex中实现这一点。我将运行2个正则表达式。提取[DM]{5}字符串的第一个正则表达式,例如

(ABCHEHG)[HGHE]{51230}(EEJOPK)[DM]{5}

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


这在Perl中很容易做到:

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
中),最后我们使用它动态生成一个子模式,在
$1

中用
C
替换所有
D
,用
N
替换
M
,你使用的是什么编程语言?@melpomene:编程语言对我来说真的不重要。我只是想找到正确的“逻辑”来做这件事。到目前为止,我已经在R和shell中试用过了。但是perl正则表达式也与R兼容,所以这也在我的列表中。任何编程语言都是非常受欢迎的。我的答案是Perl,所以它不太可能在任何其他语言中工作。那太好了。我将在R中尝试它(stringr/stringi包与Perl regex兼容),如果它不起作用,我将在Perl中尝试它。这确实是一个非常有趣的解决方案。但是,如果有几个这样的依赖字符串被合并到正则表达式中,这仍然有效吗?更重要的是,如果在某个点上有一个像[HG]{6,20}这样的节,我想在正则表达式的另一个节中分别用J和L来补充它呢?这个[HG]会不会与我的正则表达式的[HGHE]{51230}部分中的HG混合和混淆?@lekum我看不出问题所在。您只需要定义更多的捕获组并使用
$2
$3
等。