需要帮助正则表达式

时间:2010-06-09 13:18:32

标签: regex

我需要一个正则表达式:

字符串是字母数字,前半部分正好有6个字符,后跟连字符(可选),后跟可选的4个字符:(后半部分不能超过4个字符)

所以以下任何一项都有效

11111A
111111-1
111111-yy
yyyyy-989
yyyyyy-9090

我认为这个表达式/[a-zA-Z0-9]([-])?[a-zA-Z0-9]{5,10}$/;应该有效,但我无法使其正常工作。

任何帮助将不胜感激,

4 个答案:

答案 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]

<强>更新

避免零的两种方法:

  1. 如果您知道最后一个数字(例如)不能为0,则拆分您的组
    ^\w{5}[a-zA-Z1-9]-?\w{0,3}[a-zA-Z1-9]$
  2. Negative look-ahead,非常强大,但在所有正则表达式“风格”(实现)中都不可用:
    ^(?!0{6})\w{6}-?(?!0+$)\w{0,4}$
    那些“零宽度”断言不消耗字符,它们只检查前面的内容并在遇到模式时导致匹配失败(在否定前瞻的情况下) )。第一个很容易,检查我们是否正好有六个0。第二个检查在行/字符串的结尾(+)之前是否有一个或多个($)0。

答案 3 :(得分:0)

可能偏离主题,但由于我不是正则表达式专家,我经常使用txt2regex程序,它有助于从文本菜单构建它们。 http://txt2regex.sourceforge.net

无法拒绝引用这句话:“程序员遇到了问题。他意识到他可以用正则表达式来解决它。现在他有两个问题。”