我有这个正则表达式: ^[a-zA-Z]\s{3,16}$
我想要的是将任何名称与任何空格匹配,例如,John Smith 并且包含 3 到 16 个字符长..
我究竟做错了什么?
背景
这里有几点需要注意。首先,量词(在本例中为{3,16}
)仅适用于最后一个正则表达式标记。因此,您当前的正则表达式真正要表达的是“匹配具有单个字母字符(不区分大小写)后跟 3 到 16 个空白字符(例如空格、制表符等)的任何字符串。”
其次,一个名字可以有两个以上的部分(中间名、某些民族名称,如“De La Cruz”)或包含特殊字符,如重音元音。您应该考虑这是否是您需要在程序中考虑的事情。这些事情很重要,在任何实际应用中都应该考虑。
假设和答案
现在,让我们假设您只需要由名字、姓氏和空格组成的名称的特定格式。我们还假设您只需要简单的 ASCII 字符(即没有特殊字符或重音字符)。此外,名字和姓氏都应以大写字符开头,后跟小写字符。除此之外,对名称各个部分的长度没有限制。在这种情况下,以下正则表达式可以解决问题:
^(?=.{3,16}$)[A-Z][a-z]+ [A-Z][a-z]+$
笔记
^
字符后的第一个标记称为正向前瞻。基本上,积极向前看将匹配开始(?=
和结束之间的正则表达式,而)
无需实际移动与字符串匹配的光标位置。
请注意,我删除了\s
令牌,因为您通常只需要一个(空格)。
\s
如果需要制表符和其他空格,则可以用标记替换该空格。
我还添加了一个限制,即名称必须以大写字母开头,后跟小写字母。
粗略的英语翻译
为了帮助您理解,这里是正则表达式真正作用的简单英文翻译。斜体部分只是从正则表达式的英文翻译的第一部分复制而来。
“匹配任何包含 3-16 个字符并以大写字母字符开头,后跟一个或多个 (
+
) 字母字符后跟单个空格后跟一个大写字母字符后跟一个或多个 (+
) 字母字符并以任何字符结尾的字符串小写字母。”
工具
当我尝试解决具有挑战性的正则表达式时,我喜欢使用一些工具。它们在下面没有特定的顺序列出:
编辑/更新
您在评论中提到您在 JavaScript 中使用正则表达式。JavaScript 在正则表达式周围使用正斜杠来确定什么是正则表达式。对于这个简单的情况,有 2 个选项可以使用正则表达式来匹配字符串。
首先使用String
的match方法如下
"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
取决于正则表达式是否实际匹配字符串。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句