String中单个匹配项的正则表达式

时间:2013-11-18 22:49:47

标签: regex

我是正则表达式的新手,似乎无法为我需要做的事做正确的语法。我需要一个字母数字字符串的正则表达式,字符串长度可以是1-8个字符,最多可以包含1个短划线,但不能单独使用一个短划线。

有效:

A-
-A
1234-678
ABC76-

无效:

-
F-1-
ABCD1234-
---   

提前致谢!

2 个答案:

答案 0 :(得分:3)

试试这个正则表达式:

/^(?!([^-]*-){2})[a-zA-Z0-9-]{1,8}$/
  • ^ and $将匹配开始和结束。
  • (?!([^-]*-){2})是一个前瞻,确保匹配模式最多只有一个连字符。
  • [a-zA-Z0-9-]{1,8}匹配1到8个字母数字或 -

参考: http://regular-expressions.info

答案 1 :(得分:3)

一种方式。 (对不起,如果已经发布)

 #  ^(?=[a-zA-Z0-9-]{1,8}$)(?=[^-]*-?[^-]*$)(?!-$).*$

 ^                              # BOL
 (?= [a-zA-Z0-9-]{1,8} $ )      # 1 - 8 alpha-num or dash
 (?= [^-]* -? [^-]* $ )         # at most 1 dash
 (?! - $ )                      # not just a dash
 .* $

编辑:只需将其扩展为以逗号

分隔的细分
 #  ^(?!,)(?:(?=(?:^|,)[a-zA-Z0-9-]{1,8}(?:$|,))(?=(?:^|,)[^-]*-?[^-]*(?:$|,))(?!(?:^|,)-(?:$|,)),?[^,]*)+(?<!,)$


 ^                         # BOL
 (?! , )                   # does not start with comma
 (?:                       # Grouping
      (?=
           (?: ^ | , )
           [a-zA-Z0-9-]{1,8}         # 1 - 8 alpha-num or dash
           (?: $ | , )
      )
      (?=
           (?: ^ | , )
           [^-]* -? [^-]*            # at most 1 dash
           (?: $ | , )
      )
      (?!
           (?: ^ | , )
           -                         # not just a dash
           (?: $ | , )
      )
      ,? [^,]*                  # consume the segment
 )+                        # Grouping, do many times

 (?<! , )                  # does not end with comma
 $                         # EOL

Edit2:如果您的引擎不支持lookbehinds,这是一回事,但没有

 #  ^(?!,)(?:(?=(?:^|,)[a-zA-Z0-9-]{1,8}(?:$|,))(?=(?:^|,)[^-]*-?[^-]*(?:$|,))(?!(?:^|,)-(?:$|,))(?!,$),?[^,]*)+$


 ^                         # BOL
 (?! , )                   # does not start with comma
 (?:                       # Grouping
      (?=
           (?: ^ | , )
           [a-zA-Z0-9-]{1,8}         # 1 - 8 alpha-num or dash
           (?: $ | , )
      )
      (?=
           (?: ^ | , )
           [^-]* -? [^-]*            # at most 1 dash
           (?: $ | , )
      )
      (?!
           (?: ^ | , )
           -                         # not just a dash
           (?: $ | , )
      )
      (?! , $ )                 # does not end with comma

      ,? [^,]*                  # consume the segment
 )+                        # End Grouping, do many times

 $                         # EOL