我有一堆包含重复模式的字符串,我们称之为ABCD
,就像这样:
ABCDABCDABCD
因此可以由正则表达式(ABCD)+
捕获。但有时字符串会在两端被截断。所以我也可以有,例如,
CDABCDABCDABCDA
所以我看到的方式有3个部分:开始,重复部分和结束;其中开头必须包含ABCD
的任何后缀,而结尾部分可能包含ABCD
的任何前缀。
对于这个简单的案例,我可以设计一些复杂的东西,比如
(BCD|CD|D)?(ABCD)+(A|AB|ABC)?
但实际上我的重复模式比ABCD
长得多,因此写出所有可能的前缀和后缀非常麻烦。这个问题有一个很好的通用解决方案吗?
答案 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
匹配\1
和BCD
匹配\3
)
我们的想法是将最后一个ABCD与ABC
相匹配,并使用\3.*
检查第1组