昨天我问过Capturing prefixes and suffixes using regex。对于给定的重复模式ABCD
,我想要一个能够完全捕获"完全"的正则表达式。重复字符串,如ABCD
和ABCDABCDABCD
以及"截断"像ABCDA
和DABCDABCD
之类的。对于这项任务,Casimir et Hippolyte慷慨地提供了以下很好的正则表达式:
^(.*?)(ABCD)*(?=ABCD(.*)$)(?=.*\1\3$)\3.*\3
确实符合我的规格。但是现在我想补充一点,即重复模式还不需要发生,所以除了这个正则表达式捕获的内容之外,以下字符串也是合法的:
A
AB
ABC
B
BC
BCD
BCDA
BCDAB
BCDABC
C
CD
CDA
CDAB
CDABC
D
DA
DAB
DABC
如何修改此正则表达式或提出一个新的正则表达式来捕获这些字符串?
请注意,我正在寻找一种适用于可变长度重复模式的通用解决方案。
答案 0 :(得分:1)
^(?:A(?=B|$)|B(?=C|$)|C(?=D|$)|D(?=A|$))+
这在宏观方案中有4个部分,它们彼此非常相似:
^ # Beginning
(?:
A(?=B|$) # A followed by a B or end of string
|
B(?=C|$) # B followed by a C or end of string
|
C(?=D|$) # C followed by a D or end of string
|
D(?=A|$) # D followed by an A or end of string
)+ # Repeat as many times as necessary