我有一系列逗号分隔的单词,如x1,x2,x3 ....此序列中的某些单词可能是可选的,即序列x1,x3,x4,x6对x2和x5是可选的有效,并且其余的话是强制性的。上述顺序可以重复最多n次。
例如,单词x1,x2,x3的序列最多可重复3次,x2是可选的,以下是有效序列:x1,x3,x1,x2,x3,x1,x3
如何使用正则表达式模式验证上述内容?
我尝试过类似的东西(,{0,1}x1,(x2,){0,1}x3,{0,1}){3}
但是如果我使用{1,3},那么上述将适用于所有三倍的倍数,那么任何重复次数都会匹配,因为它们是1 { 1 ,3}的倍数。
答案 0 :(得分:2)
您的示例工作正常,但正如您所注意到的那样,您只检查目标字符串是否包含匹配的字符序列。您需要使用\A
和\z
在字符串的开头和结尾锚定正则表达式,以确保整个字符串匹配。
此外,{0,1}
更简单地写为?
,并且当您不需要捕获时,捕获括号( ... )
更好地写为非捕获括号(?: ... )
子串。
尝试对正则表达式进行此修改,该正则表达式使用/x
修饰符允许将无效的空格添加到表达式中以更好地进行布局。
m/ \A (?: x1, (?: x2, )? x3 ,? ){1,3} \z /x;