我为格式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
答案 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}$/
您要说的是,在一系列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}$/
答案 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)修正了上述内容:)