2012-05-16 33 views
1

我有一系列逗号分隔的单词,如x1,x2,x3 ....这个序列中的某些单词可能是可选的,即序列x1,x3,x4,x6是有效的,x2和x5是可选的,而其余​​的话是强制性的。上述顺序最多可重复n次。正则表达式验证序列

对于离,词语X1,X2的序列,X 3可以与X 2是可选被重复3次最大,以下是有效的序列:X1,X3,X1,X2,X3,X1,X3

如何使用正则表达式验证上述内容?

我想是这样 (,{0,1}x1,(x2,){0,1}x3,{0,1}){3} 但上面会三的倍数工作,如果我使用{1,3},然后重复的任何款项将匹配,因为他们的倍数1 {,3 }。

+0

您能否提供更多有效和无效的示例序列?例如:你是否严格按照升序排列数字? – ohaal

回答

2

您的示例工作正常,但正如您所注意的那样,您只检查目标字符串是否包含的匹配字符序列。您需要使用\A\z来确定整个字符串匹配的锚点字符串开始和结束处的正则表达式。

此外,{0,1}更简单地写为?,并且捕获括号(...)更好地写成非捕获那些(?: ...)当你不需要捕捉子。

尝试对您的正则表达式进行此修改,该修改使用/x修饰符来允许将不重要的空白添加到表达式中,以更好地布置它。

m/ \A (?: x1, (?: x2,)? x3 ,?){1,3} \z /x; 
+0

很好的答案,但是正则表达式会产生一些误报:例如'x1,x2,x3x1,x2,x3'(注意连接到两个子序列的缺失逗号)。您可以使用替代来指定逗号或字符串结尾:'(?:,| \ z)',而不是使最后的逗号为可选。 – FMc