我正在尝试制作一个正则表达式,它必须与以下名称相匹配:John Smith。唯一的规则是名字和姓氏应以大写字母开头,并且长度必须至少为2个字符。姓氏最多也有20个字符的限制,名称之间有一个昏迷或空格。到目前为止,我有这个:
/[A-Z][a-z]+(\s|,)[A-Z][a-z]{19}/
在我在此网站中测试时,它不起作用:http://www.regular-expressions.info/javascriptexample.html。我不确定我错过了什么。有什么想法吗?
答案 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个小写字符。