Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 名字和姓氏的正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 名字和姓氏的正则表达式

Javascript 名字和姓氏的正则表达式,javascript,regex,Javascript,Regex,我正在尝试创建一个regexp,其中必须匹配一个名称,如:John Smith。唯一的规则是名字和姓氏必须以大写字母开头,并且长度必须至少为2个字符。此外,姓氏最多可包含20个字符,并且名字之间有空格或空白。到目前为止,我有: /[A-Z][a-z]+(\s|,)[A-Z][a-z]{19}/ 当我在此网站上测试它时,它不起作用:。我不确定我错过了什么。有什么想法吗?你需要{0,19}而不仅仅是{19}。后者的意思是“正好19个字符” 当然,这个regexp与许多完全有效的名称不匹配,比如“J

我正在尝试创建一个regexp,其中必须匹配一个名称,如:John Smith。唯一的规则是名字和姓氏必须以大写字母开头,并且长度必须至少为2个字符。此外,姓氏最多可包含20个字符,并且名字之间有空格或空白。到目前为止,我有:

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

当我在此网站上测试它时,它不起作用:。我不确定我错过了什么。有什么想法吗?

你需要
{0,19}
而不仅仅是
{19}
。后者的意思是“正好19个字符”

当然,这个regexp与许多完全有效的名称不匹配,比如“JoséOrtega y Gasset”或“Charles de Batz Castelmore d'Artagnan”


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

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

更新:人们评论说这不符合你的要求。正如您所描述的,它可能是对您的需求的一个幼稚的实现,但它只是您修复了bug的原始实现。如果您实际上是在寻找名称,那么一个不太简单的实现可能是:

/^[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/

这应该对你有用

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

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

第{19}个字符意味着姓氏在第一个大写字符后必须正好有19个小写字符

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

(^[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

(1) “不起作用”永远不是一个足够的问题描述。(2) 为什么不使用浏览器控制台来测试regex呢?@MΓΓБББLL,实际上,我认为regex是一个例外,其中“不工作”是一个有效的问题描述。在这个领域,它隐含的意思是“不匹配我想要匹配的东西”,他准确地解释了他想要匹配的东西。你知道,这是一个非常糟糕的方法。这太天真了。想想看,在任何一个和所有的提姆,奥雷利,约翰保罗琼斯,William Mᶜ金利、马尔科姆·克斯、谢尔、多米尼克·斯特劳斯·卡恩、费德里科·佩尼亚、弗朗索瓦·密特朗、尼古拉·齐奥埃斯库、蒋介石、玛丽亚·何塞·马尔克斯、何塞·玛丽亚·华雷斯或费德里科·德萨格拉多·科拉多·德耶斯·加西亚·洛卡。这只适合做作业的人。老师只指定了那些要求,所以我不想把它简单化。但感谢您的所有想法:)@user977151,一般来说,在发布关于家庭作业问题的帮助时,最好添加“家庭作业”标签。“U”是一个非常有效的姓氏。@thg435,也许吧,但OP不希望正则表达式与之匹配。他特别指出,“姓氏应该以大写字母开头,并且必须至少有2个字符长”。这对勒内·弗莱明或蒂姆·奥莱利来说是行不通的。或者马尔科姆X.或者多米尼克·斯特劳斯·卡恩。来吧,伙计们,现实点。@BenLee:你们的模式不符合这些规范。@BenLee:他们的表达式有不止一个bug。您可能希望尝试全部更正。此正则表达式允许数值。我怎样才能做到呢
/^[A-Z][a-z]+[\s|,][A-Z][a-z]{1,19}$/.test("John Smith") // true
\b[A-Z]+.+[?^ ][A-Z].{1,19}|\b[A-Z]+.+[?^,][A-Z].{1,19}
(^[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