我需要一个正则表达式:
字符串是字母数字,前半部分正好有6个字符,后跟连字符(可选),后跟可选的4个字符:(后半部分不能超过4个字符)
所以以下任何一项都有效
11111A
111111-1
111111-yy
yyyyy-989
yyyyyy-9090
我认为这个表达式/[a-zA-Z0-9]([-])?[a-zA-Z0-9]{5,10}$/;
应该有效,但我无法使其正常工作。
任何帮助将不胜感激,
答案 0 :(得分:5)
^[a-zA-Z0-9]{6}(-[A-Za-z0-9]{1,4})?$
答案 1 :(得分:1)
^[a-zA-Z0-9]{6}-?[a-zA-Z0-9]{0,4}$
这不像其他一些简洁,但它是防弹的。 Tanascius和Streetpc的解决方案将匹配______-____
,因为\w
匹配下划线。
一个问题:你说破折号是可选的,以下四个字符是可选的,这是否意味着111111AAAA
应该匹配?如果是这样,我上面的正则表达式适合你,因为Tanascius'不会匹配这个。
如果不是这样,那么你会想要这个:
^[a-zA-Z0-9]{6}(?:-[a-zA-Z0-9]{1,4})?$
使用稍微更有效的无后向分组。
最后一件事。此解决方案与111111-
不匹配,但与11111-A
匹配。如果您想在111111-
上匹配,但不想要匹配111111A
,请使用此功能:
^[a-zA-Z0-9]{6}(?:-[a-zA-Z0-9]{0,4})?$
编辑: Tanascius的解决方案不再使用\w
,因此请忽略上述内容。
答案 2 :(得分:0)
如果您的前6个和后4个仅为字母数字:
^\w{6}-?\w{0,4}$
注意:\w
是[a-zA-Z0-9_]
的便捷快捷方式,但它允许使用下划线(_
)。如果您不想要这些,只需将其替换为[a-zA-Z0-9]
。
<强>更新强>
避免零的两种方法:
^\w{5}[a-zA-Z1-9]-?\w{0,3}[a-zA-Z1-9]$
^(?!0{6})\w{6}-?(?!0+$)\w{0,4}$
+
)之前是否有一个或多个($
)0。答案 3 :(得分:0)
可能偏离主题,但由于我不是正则表达式专家,我经常使用txt2regex程序,它有助于从文本菜单构建它们。 http://txt2regex.sourceforge.net。
无法拒绝引用这句话:“程序员遇到了问题。他意识到他可以用正则表达式来解决它。现在他有两个问题。”