使用正则表达式捕获前缀和后缀

时间:2014-05-07 01:28:25

标签: regex

我有一堆包含重复模式的字符串,我们称之为ABCD,就像这样:

ABCDABCDABCD

因此可以由正则表达式(ABCD)+捕获。但有时字符串会在两端被截断。所以我也可以有,例如,

CDABCDABCDABCDA

所以我看到的方式有3个部分:开始,重复部分和结束;其中开头必须包含ABCD的任何后缀,而结尾部分可能包含ABCD的任何前缀。

对于这个简单的案例,我可以设计一些复杂的东西,比如

(BCD|CD|D)?(ABCD)+(A|AB|ABC)?

但实际上我的重复模式比ABCD长得多,因此写出所有可能的前缀和后缀非常麻烦。这个问题有一个很好的通用解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以使用此模式:

^(.*?)(ABCD)*(?=ABCD(.*)$)(?=.*\1\3$)\3.*\3

在第1组和第3组中分别捕获开始和结束。第三次捕获在预测中执行,以描述模式的结束。

(ABCD)*将匹配除最后一个之外的所有重复ABCD。由于前瞻也包含ABCD,因此您可以确定最后一个ABCD立即跟随。但是,不是使用子模式ABCD描述最后一个ABCD,而是使用反向引用\3(可以是:'', A, AB, ABC),一个未确定数量的字符,并检查反向引用{{ 1}}(可以是\1)在预测中允许重叠的情况(即'', D, CD, BCD匹配\1BCD匹配\3

我们的想法是将最后一个ABCD与ABC相匹配,并使用\3.*检查第1组