正则表达式验证序列

Posted

技术标签:

【中文标题】正则表达式验证序列【英文标题】:Regex validate sequence 【发布时间】:2012-05-23 20:07:37 【问题描述】:

我有一系列逗号分隔的单词,例如 x1,x2,x3.... 这个序列中的一些单词可能是可选的,即序列 x1,x3,x4,x6 是有效的,x2 和 x5 是可选的,并且其余的词是强制性的。上述序列最多可重复 n 次。

例如,单词x1,x2,x3的序列最多可以重复3次,其中x2是可选的,以下是一个有效的序列:x1,x3,x1,x2,x3,x1,x3

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

我尝试过类似的东西 (,0,1x1,(x2,)0,1x3,0,1)3 但是以上内容适用于所有三的倍数,如果我使用 1,3 那么任何数量的重复都将匹配,因为它们是 1 1,3 的倍数。

【问题讨论】:

您能否提供更多示例序列,包括有效的和无效的?示例:您对递增顺序的数字是否严格? 【参考方案1】:

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

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

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

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

【讨论】:

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

以上是关于正则表达式验证序列的主要内容,如果未能解决你的问题,请参考以下文章

java正则表达式的子序列是啥

请问如何用正则表达式验证一个表示路径的字符串的合法性

用于以特定顺序验证电话号码的正则表达式

如何在 PHP 中验证 utf 序列?

比较常用证件正则表达式验证大全

验证用户名的正则表达式