是否有可能设计正则表达式,使其一部分依赖于同一正则表达式的另一部分?
请考虑以下示例:
(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.。
发布于 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引擎用于它擅长的简单事情,并将复杂的业务逻辑决策委托给您的应用程序。
发布于 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
发布于 2017-09-10 18:25:42
这在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中)实际匹配的字符串,然后在结束时使用该字符串动态生成子模式,方法是将所有D替换为C,将M替换为$1中的N。
https://stackoverflow.com/questions/46143708
复制相似问题