RegExp空格字符

时间:2017-04-19 01:18:26

标签: regex

我有这个正则表达式:^[a-zA-Z]\s{3,16}$

我想要的是将任何名称与任何空格匹配,例如John Smith,其中包含3到16个字符。

我做错了什么?

1 个答案:

答案 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");

后者可能是您想要的,因为它只返回truefalse,具体取决于正则表达式是否与字符串实际匹配。