我在正则表达式中表现不佳,但我正在学习。目前我需要验证名称,我无法为其编写有效的正则表达式。有效名称仅包含字母或带有连字符或空格的字母。
有效名称的示例为
jones
jones-smiht
a loreal jones
但如果名称包含数字,则表示名称无效。以下正则表达式
^[-\\sa-zA-Z]+$
工作正常,但只有-
也被视为有效名称。
如何修改它以使有效名称必须包含字母,或者是否包含连字符和空格?
答案 0 :(得分:2)
我认为你正在寻找这个正则表达式:
^[a-zA-Z][-\\sa-zA-Z]*$
这将确保您的名字始终以字母开头,而不是以连字符或空格开头。
注意:在Java中,您还可以使用(?i)
进行忽略大小写并缩短正则表达式,如下所示:
(?i)^[a-z][-\\sa-z]*$
答案 1 :(得分:1)
您的字面答案为^[a-zA-Z][-\sa-zA-Z]*$
。
有更好的答案:例如,
([a-zA-Z]+)([-\s][a-zA-Z]+)*
允许以单个空格或短划线分隔的任意数量的单词,允许simon peyton-jones
,但禁止像--jumbo-spaz--
这样的愚蠢。
从我试图在已删除的答案上发布的回复中复制:
Regexp是单反斜杠。但是,由于regexp是用Java中的字符串构造的,因此需要转义反斜杠;但它是字符串的特征,而不是正则表达式。因此,regexp是
\s
,但您需要在Java中编写Pattern.compile("\\s")
。并非所有语言都有这种扭曲,因此将字符串规则与Regexp分开是有用的。