1

我有一系列逗号分隔的单词,例如 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} 的倍数

4

1 回答 1

2

您的示例工作正常,但正如您所注意到的,您只检查目标字符串是否包含匹配的字符序列。您需要将正则表达式锚定在字符串的开头和结尾,并使用\A\z确保整个字符串匹配。

此外,{0,1}更简单地写为,当您不需要捕获子字符串时?,捕获括号( ... )最好写为非捕获括号。(?: ... )

尝试对正则表达式进行这种修改,它使用/x修饰符允许将无关紧要的空格添加到表达式中以更好地布局。

m/ \A (?: x1, (?: x2, )? x3 ,? ){1,3} \z /x;
于 2012-05-16T13:10:08.170 回答