【问题标题】:Valid name cannot accept only hyphen有效名称不能只接受连字符
【发布时间】:2013-07-16 13:19:25
【问题描述】:

我的正则表达式很弱,但我正在学习。目前我需要验证名称,但我无法为其编写有效的正则表达式。有效的名称应仅包含字母或带有连字符或空格的字母。

有效名称的示例是

jones
jones-smiht
a loreal jones

但如果名称包含数字,则它是无效名称。以下正则表达式

^[-\\sa-zA-Z]+$ 工作正常,但只有 - 也被视为有效名称。

如何修改它以使有效名称必须包含字母,无论它是否包含连字符和空格?

【问题讨论】:

  • 您认为-a 是一个有效的名称吗?

标签: regex


【解决方案1】:

我认为您正在寻找这个正则表达式:

^[a-zA-Z][-\\sa-zA-Z]*$

这将确保您的姓名始终以字母开头,而不是以连字符或空格开头。

注意:在 Java 中,您还可以使用 (?i) 忽略大小写并缩短正则表达式,如下所示:

(?i)^[a-z][-\\sa-z]*$

【讨论】:

  • 不客气,很高兴知道它有效。如果此回答帮助您解决了问题,请考虑将其标记为“已接受”,以便日后遇到类似问题的用户能够轻松查看。
【解决方案2】:

您的实际答案是^[a-zA-Z][-\sa-zA-Z]*$

有更好的答案:例如,

([a-zA-Z]+)([-\s][a-zA-Z]+)*

将允许用单个空格或破折号分隔任意数量的单词,允许simon peyton-jones,但不允许像--jumbo-spaz-- 这样的愚蠢。

并从我尝试在已删除答案上发布的回复中复制:

正则表达式是单反斜杠。但是,由于正则表达式是从 Java 中的字符串构造的,因此您需要转义反斜杠;但它是字符串的特征,而不是正则表达式的特征。所以,正则表达式是\s,但是你需要用Java写Pattern.compile("\\s")。并非所有语言都有这种扭曲,因此将字符串规则与 Regexp 分开是很有用的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多