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

时间:2011-04-21 03:54:43

标签: regex

我为格式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

3 个答案:

答案 0 :(得分:5)

这样就可以了。您基本上希望XX-的任意数字(零或更多)后跟零,一个或两个X

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

答案 1 :(得分:2)

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

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

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

获得最后一点非常困难,因为你必须嵌套条件元素。 I.E.最后的连字符仅在前面的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]-?)?)?$

我是forked SeanA的jsfiddle。谢谢,肖恩!

更新

感谢Alan Moore“看守望者”的出色工作(见评论),我意识到你可以通过

更简单地做到这一点
/^([A-Za-z0-9]{2}-)*[A-Za-z0-9]{0,2}$/

An updated fiddle for that RE

您要说的是,在一系列X段的末尾最多可以有两个XX-个。这是有效的,因为如果最后有一个连字符,它将只是一个额外的XX-段的一部分。

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

如果您希望匹配XX-XX-XX-XX-XX而不是XX-XX-XX-XX-XX-,则可以使用

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

A forked fiddle for that use case

答案 2 :(得分:1)

看起来这就是诀窍:

/^([\w\d]{2}-)*([\w\d]|([\w\d]{2}-?)?)$/

在此处查看此行动:http://jsfiddle.net/sadkinson/FaQe6/6/

说明:

/^([\w\d]{2}-)*  -- any number of XX-
([\w\d]          -- either a single X
|([\w\d]{2}-?)?  -- or two Xs and maybe a dash to end

更新:我根据评论者非常精明的观察(+1)修正了上述内容:)