2

在我的 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,}?))+$

我已经达到了正则表达式的极限,希望得到任何指导。我正在寻找的结果是否可以通过一个表达式来实现?

4

3 回答 3

2

你可能会使用这样的东西:

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

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

于 2013-09-26T17:03:11.907 回答
2

我用这个表达式尝试了你所有的用例:

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

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

于 2013-09-26T17:27:37.647 回答
1

这就是我要做的,也可以防止多个破折号:

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

在这里测试。

于 2013-09-26T17:12:47.347 回答