连字符分隔字符串的正则表达式

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (97)

我为格式XX-XX-XX-XX-XX创建了一个正则表达式,其中XX是一个字母数字。

正则表达式是^[a-z0-9A-Z]{2}-[a-z0-9A-Z]{2}-[a-z0-9A-Z]{2}-[a-z0-9A-Z]{2}$。但我真正想做的是匹配以下模式。我的字符串每2个字符应该有一个连字符( - )。

exapmle 1 : XX-            OK
exapmle 2 : XX-X           OK 
exapmle 3 : XX-XX-         OK 
exapmle 4 : XX-XX-XX       OK
exapmle 5 : XX-XX-XX-X     OK
exapmle 6 : XX-XX-X        OK
exapmle 7 : XX-XX--        NOT OK
exapmle 8 : XX-XX-X-       NOT OK
提问于
用户回答回答于

匹配需要从任意数量的XX-字符串匹配开始:

^([A-Za-z0-9]{2}-)*

根据您正在使用的正则表达式引擎,您可以在[[:alnum:]]这里使用更简洁。请注意,[\w\d]由于几个原因,最初发布的内容不合适; 有关详细信息,请参阅Alan Moore的评论。

最后一点是非常困难的,因为你必须嵌套条件元素。IE最后的连字符仅在前面的X匹配时匹配,并且X仅在第一个匹配时才匹配。

请注意,此方法假定您不限制XX-段数。特别要注意它会匹配 XX-XX-XX-XX-XX-。您可以用XX-非常轻松地限制段的数量,但是在第五个之后使其与连字符不匹配XX会稍微复杂一些。

无论如何,回到解释。以下X是可以的:

^([A-Za-z0-9]{2}-)*([A-Za-z0-9])?

如果后面是另一个,那也没关系X

^([A-Za-z0-9]{2}-)*([A-Za-z0-9]([A-Za-z0-9])?)?

-也没问题(假设它的前面是XX):

^([A-Za-z0-9]{2}-)*([A-Za-z0-9]([A-Za-z0-9]-?)?)?

最后,追加$指定它应该占用整行:

^([A-Za-z0-9]{2}-)*([A-Za-z0-9]([A-Za-z0-9]-?)?)?$

我已经分享了 SeanA的jsfiddle。谢谢,肖恩!

更新

感谢Alan Moore“看守望者”的出色工作(见评论),我意识到你可以更简单地做到这一点

/^([A-Za-z0-9]{2}-)*[A-Za-z0-9]{0,2}$/

在这里,你要说的是X在一系列XX-片段的末尾最多可以有两个s 。这是有效的,因为如果最后有连字符,它将成为附加XX-段的一部分。

我已经留下了上述信息,因为它解决了一个更普遍的问题。例如,如果每个段由字母和数字组成,则必须采用这种方法。

如果你想要它匹配XX-XX-XX-XX-XX但不是XX-XX-XX-XX-XX-,你可以使用

/^([A-Za-z0-9]{2}-){0,4}[A-Za-z0-9]{0,2}$/
用户回答回答于

这样就可以了。你基本上想要任何数字(零或更多)XX-后跟零,一或两个X

^([0-9A-Za-z]{2}-)*[0-9A-Za-z]{0,2}$

扫码关注云+社区

领取腾讯云代金券