我有这个正则表达式:^[a-zA-Z]\s{3,16}$
我想要的是将任何名称与任何空格匹配,例如John Smith,其中包含3到16个字符。
我做错了什么?
答案 0 :(得分:1)
<强>背景强>
这里有几点需要注意。首先,量词(在这种情况下,{3,16}
)仅适用于最后一个正则表达式令牌。那么你当前的正则表达式真正说的是&#34;匹配任何具有单个字母字符(不区分大小写)的字符串,后跟3到16个空格字符(例如空格,制表符等)。&#34; < / p>
其次,名称可以超过2个部分(中间名,某些种族名称,如&#34; De La Cruz&#34;)或包含特殊字符,如重音元音。您应该考虑这是否是您需要在程序中考虑的内容。这些事情很重要,应该考虑用于任何真正的应用程序。
假设和答案
现在,让我们假设您只需要某个名称的格式,该名称由名字,姓氏和空格组成。我们还假设您只需要简单的ASCII字符(即没有特殊字符或重音字符)。此外,名字和姓氏都应以大写字母开头,后跟小写字符。除此之外,名称的各个部分的长度没有限制。在这种情况下,以下正则表达式可以解决这个问题:
^(?=.{3,16}$)[A-Z][a-z]+ [A-Z][a-z]+$
备注强>
^
字符后面的第一个标记叫做positive lookahead。基本上,正面向前看将匹配开头(?=
和结束)
之间的正则表达式,而不实际移动与该字符串匹配的光标位置。
注意我删除了\s
令牌,因为通常只需要(空格)。如果需要制表符和其他空格,则可以使用
\s
标记替换该空格。
我还添加了一个限制,名称必须以大写字母开头,后跟小写字母。
粗俗英语翻译
为了帮助您理解,这里是正则表达式真正做的简单英文翻译。斜体部分只是从正则表达式的英文翻译的第一部分复制而来。
&#34;匹配任何包含3-16个字符的字符串,并以大写字母字符开头,后跟一个或多个(
+
)字母字符,后跟单个空格,后跟大写字母字符后跟一个或多个(+
)字母字符,以任何小写字母结尾。&#34;
工具强>
当我尝试解决具有挑战性的正则表达式时,我喜欢使用几种工具。它们在下面没有特别的顺序列出:
修改/更新强>
您在评论中提到您在JavaScript中使用正则表达式。 JavaScript使用正则表达式周围的正斜杠来确定什么是正则表达式。对于这个简单的情况,使用正则表达式匹配字符串有两个选项。
首先,使用String
的匹配方法如下
"John Smith".match(/^(?=.{3,16}$)[A-Z][a-z]+ [A-Z][a-z]+$/);
其次,创建一个正则表达式并使用其test()
方法。例如,
/^(?=.{3,16}$)[A-Z][a-z]+ [A-Z][a-z]+$/.test("John Smith");
后者可能是您想要的,因为它只返回true
或false
,具体取决于正则表达式是否与字符串实际匹配。