使用正则表达式捕获前缀或后缀或两者

时间:2014-05-08 04:28:18

标签: regex

昨天我问过Capturing prefixes and suffixes using regex。对于给定的重复模式ABCD,我想要一个能够完全捕获"完全"的正则表达式。重复字符串,如ABCDABCDABCDABCD以及"截断"像ABCDADABCDABCD之类的。对于这项任务,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

如何修改此正则表达式或提出一个新的正则表达式来捕获这些字符串?

请注意,我正在寻找一种适用于可变长度重复模式的通用解决方案。

1 个答案:

答案 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