【发布时间】:2020-10-02 14:42:57
【问题描述】:
是否有一种简单的方法可以使用另一个正则表达式从正则表达式中删除正/负后向/前瞻组(考虑括号内)?
示例源表达式:A(?<!B(C)D)E(?<=F)G(?!H(I(J))K)L(?=M(O)P)Q(?>R)S(T)
我要删除的部分:
(?<!B(C)D)(?<=F)(?!H(I(J))K)(?=M(O)P)
到目前为止,我使用表达式\(\?\<?[!=].+?\) 来查找要删除的部分,但内括号会产生问题...例如,不是查找(?<!B(C)D) 部分,而是查找(?<!B(C)...
我考虑过用(?# 替换(?<!、(?!、(?<= 和(?=(将它们转换为嵌入式评论),这在“regex101.com”上非常有效,但遗憾的是在 JAVA 中不行。 ..
我试图避免用一堆 if-else 逻辑遍历每个字符。
注意:我在 Java (Kotlin) 中使用这些正则表达式,并使用“containsMatchIn”方法将源表达式与实际文本匹配。
【问题讨论】:
-
我会编写或使用解析器——当您可以拥有任意嵌套的括号时,拥有一个堆栈会很有帮助,因为正则表达式无法存储状态。如果您确实使用正则表达式,则需要一个递归表达式。这比欺骗目标建议的要难一些,因为您需要省略转义的子字符串,例如
\(和其他边缘情况,但它应该为您提供一个起点。 -
@ggorlen Recusion 似乎很有前途,直到我发现它在 Java 中不可用。 :-(