Regex 带字母、数字和破折号但不带前导或尾随破折号的正则表达式

Regex 带字母、数字和破折号但不带前导或尾随破折号的正则表达式,regex,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

在我的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-c
1-2-3
有效,但我尝试的任何修改都没有产生预期的结果。我对第一组和第三组做了一个小改动,但前导破折号和尾随破折号通过了:

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

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

您可以使用以下内容:

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

如果希望每个字母数字字符之间只允许一个破折号。否则,将
-
旋转到
-+
以获得多个破折号。

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

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

^(\w |)(?我用这个表达式尝试了您的所有用例:

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

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

这是有效的,但只有当我将
{2,}
更改为
{1,}
。这听起来对吗?很荣幸它限制了多个破折号,因为这是我想要的,但不是优先考虑的事情。@Mathachew Ohh,我误读了你的例子xD是的,如果你想使
a-b-c
有效,那么是的,你可以使用
{1,}
或者干脆使用
+
)我忽略了单个单词的另一个用例。我更新了我的示例并将您的表达式修改为
^[a-zA-Z0-9]+(?:[(^-|-)]+[a-zA-Z0-9]+)+$
。我现在遇到的唯一问题是我是否只使用数字。此外,允许使用双破折号。@Mathachew双破折号表示2或更多或最多2破折号?我编辑的答案最多两个破折号,并且只包含数字。它可以是两个或更多,因此我将第二个-替换为+,现在我得到了我需要的。谢谢!这很好,但是唯一的问题是我们不允许使用下划线。我知道用
[a-zA-Z0-9]
替换
\w
,但被接受的答案以更少的代价实现了相同的结果。啊,是的,下划线。这确实使Jerry的答案更短:)我忽略了单个单词的另一个用例。我已经更新了示例并将您的表达式修改为
^[a-zA-Z0-9]+([(^-|-)]+[a-zA-Z0-9]+$
。就像公认的答案一样,我在这一点上遇到的唯一问题是我是否只使用数字。允许使用双破折号。如果只在数字中使用双破折号,则应使用以下表达式:^[a-zA-Z0-9]+([-][a-zA-Z0-9]+)|([-]{1,2}+[0-9]+)+$您的表达式允许在非数值之前使用双破折号。对不起,我的意思是允许使用两个或更多破折号。问题是
123
name
在我需要有效时无效。被接受的答案符合这些要求。谢谢你的回答,看看如何用不同的表达式获得相同的结果总是很有趣的。