正则表达式的名字和姓氏

时间:2012-02-24 16:25:49

标签: javascript regex

我正在尝试制作一个正则表达式,它必须与以下名称相匹配:John Smith。唯一的规则是名字和姓氏应以大写字母开头,并且长度必须至少为2个字符。姓氏最多也有20个字符的限制,名称之间有一个昏迷或空格。到目前为止,我有这个:

/[A-Z][a-z]+(\s|,)[A-Z][a-z]{19}/

在我在此网站中测试时,它不起作用:http://www.regular-expressions.info/javascriptexample.html。我不确定我错过了什么。有什么想法吗?

6 个答案:

答案 0 :(得分:3)

{19}更改为{1,19}{19}本身就意味着“恰好匹配前一个字符中的19个”。 {1,19}表示“匹配前一个字符的1到19之间”。

/[A-Z][a-z]+(\s|,)[A-Z][a-z]{1,19}/

更新:人们评论说这不符合您的要求。正如您所描述的那样,它可能是您的需求的天真实现,但它只是您修复了错误的原始实现。如果您实际上在寻找名称,那么实施起来可能不那么天真:

/^[A-Z][-'a-zA-Z]+,?\s[A-Z][-'a-zA-Z]{0,19}$/

这将使用撇号或短划线捕获名称,如果用逗号分隔,则在名称之间使用逗号后允许空格,并允许使用单字母姓氏。但正如评论者指出的那样,这仍然无法匹配一堆合法的名字和匹配绝对不是名字的东西。

它还添加了锚点^$,表示整个字符串必须匹配。如果要查找子字符串,可以删除这些锚点并添加单词边界检查:

/\b[A-Z][-'a-zA-Z]+,?\s[A-Z][-'a-zA-Z]{0,19}\b/

答案 1 :(得分:1)

您需要{0,19}而不仅仅是{19}。后者意味着“恰好19个字符”。

"John Smith".match(/^[A-Z][a-z]{0,19}[\s,][A-Z][a-z]{0,19}$/)

当然,这个正则表达式与许多完全有效的名称不匹配,如“JoséOrtegay Gasset”或“Charles de Batz-Castelmore d'Artagnan”。

根据可接受姓氏的长度,您可以将“{0,19}”替换为“{1,19}”或“{2,19}”。这同样适用于名字。

答案 2 :(得分:1)

以下是一些可能有助于更复杂名称的表达式

(^[A-Z][a-z]*$) - A typical First Name or Last Name like Thomas
(^[A-Z][a-z][A-Z][a-z]*$) - names like McDonald
(^[A-Z][a-z]*(-|\s)[A-Z][a-z]*$) - names like Tonya-Smith or Tonya Smith
(^[A-Z]('|’)[A-Z][a-z]*$) - names like Tim O’Reilly
(^[a-z]+\s[A-Z][a-z]*$) - names like von Gogh

答案 3 :(得分:0)

/^[A-Z][a-z]+[\s|,][A-Z][a-z]{1,19}$/.test("John Smith") // true

答案 4 :(得分:0)

这应该对你有用

\b[A-Z]+.+[?^ ][A-Z].{1,19}|\b[A-Z]+.+[?^,][A-Z].{1,19}

这从一个单词的开头开始,检查第一个字母是大写字母,将第一个单词匹配到空格或逗号,然后检查以确保下一个单词的第一个字母大写,并匹配所有内容之后最多19个字符。还要确保每个名称长度为2个或更多字符。

答案 5 :(得分:0)

{19}表示姓氏必须在第一个大写字符后面包含正好19个小写字符。