带有字母,数字和短划线的正则表达式,但没有前导或尾随短划线

时间:2013-09-26 17:00:12

标签: regex

在我的ASP.NET MVC项目中是一个正则表达式,用于验证带有字母数字字符和破折号的字符串,同时也不允许使用前导或尾部破折号:

^(([a-zA-Z0-9]{1,}?)(\-{0,}?)([a-zA-Z0-9]{1,}?))+$

这适用于大多数用例:

safename                (valid)
123                     (valid)
there-is-something-here (valid)
your-name-goes-here     (valid)
-something-is-up        (invalid)
say-what-               (invalid)

但是,有些用例我想要有效,但不是:

a-b                     (valid)
a-bc-d                  (valid)
ab-cd-e                 (valid)
a-bc-de                 (valid)
this-is-a-test          (invalid)
a-b-c                   (invalid)
1-2-3                   (invalid)

我可以有一个前导和/或尾随字符,但不能在字符串的其余部分中包含单个字符。我希望a-b-c1-2-3有效,但我尝试的任何修改都没有产生预期的结果。我对第一组和第三组做了一个小改动,但是前导和尾随破折号通过了:

^(([a-zA-Z0-9]{0,}?)(\-{0,}?)([a-zA-Z0-9]{0,}?))+$

我已经达到了正则表达式的限制,并会感谢任何指导。我正在寻找一个表达式的结果吗?

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容:

^[a-zA-Z0-9]+(?:--?[a-zA-Z0-9]+)*$

如果您想在每个字母数字字符之间只允许一个短划线。否则,请将-转为-+多个破折号。

答案 1 :(得分:2)

我用该表达式尝试了所有用例:

^[a-zA-Z0-9]+([-][a-zA-Z0-9]+)+$

1-2-3有效; 1-2-无效

答案 2 :(得分:1)

这就是我要做的,也可以防止多次破灭:

^(\w|(?<=\w)-(?=\w))+$

经过测试here