我是正则表达式的新手,似乎无法为我需要做的事做正确的语法。我需要一个字母数字字符串的正则表达式,字符串长度可以是1-8个字符,最多可以包含1个短划线,但不能单独使用一个短划线。
有效:
A-
-A
1234-678
ABC76-
无效:
-
F-1-
ABCD1234-
---
提前致谢!
答案 0 :(得分:3)
试试这个正则表达式:
/^(?!([^-]*-){2})[a-zA-Z0-9-]{1,8}$/
^ and $
将匹配开始和结束。(?!([^-]*-){2})
是一个前瞻,确保匹配模式最多只有一个连字符。[a-zA-Z0-9-]{1,8}
匹配1到8个字母数字或 - 答案 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