1

我有一个文本框,我可以在其中获取用户的姓氏。如何在正则表达式中只允许一个连字符 (-)?

^([a-z A-Z]*-){1}[a-z A-Z]*$
4

5 回答 5

3

您的正则表达式恰好允许一个-. 但我假设您想要匹配“Smith”、“Smith-Kennedy”,而不是“Smith-”,为此您只需将连字符移动到第二组:

^[a-z A-Z]+(-[a-z A-Z]+)?$

顺便说一句,几乎在所有情况下,什么时候*使用+是更好的解决方案。

于 2013-04-05T06:14:53.250 回答
2

您可以使用否定前瞻来拒绝具有多个连字符的字符串:

^(?![^-]+-[^-]+-)[a-zA-Z- ]+$

在 debuggex 上匹配的演示。

debuggex 上的另一个匹配演示。

在 debuggex 上不匹配的演示演示。

于 2013-04-05T06:14:24.193 回答
1

我假设您最多需要 1 个连字符。如果是这样,你想要的正则表达式是

^[a-z A-Z]*-?[a-z A-Z]*$

您可以在www.debuggex.com上对其进行可视化。

于 2013-04-05T06:15:00.573 回答
0

如果匹配.*-.*-,则您有多个连字符,不应接受这样的字符串

于 2013-04-05T06:10:39.577 回答
0

您的正则表达式的一个问题是它强制用户将-. 您可以使用?使其成为可选:

^[a-z A-Z]*\-?[a-zA-Z]*$
于 2013-04-05T06:08:05.343 回答