我使用以下正则表达式而不限制任何字符长度
var test = /^(a-z|A-Z|0-9)*[^$%^&*;:,<>?()\""\']*$/ //Works Fine
在上面,当我尝试将字符长度限制为如下所示的15个时,会引发错误。
var test = /^(a-z|A-Z|0-9)*[^$%^&*;:,<>?()\""\']*${1,15}/ //**Uncaught SyntaxError: Invalid regular expression**
请帮助我使上述regEx的字符数限制为15。
您不能将量词应用于锚点。相反, 要限制输入字符串的长度,请 在开头使用锚定先行:
^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$ ^^^^^^^^^^^
另外,我假设您想将0个或多个字母或数字与匹配(a-z|A-Z|0-9)*。它应该看起来像[a-zA-Z0-9]*(即在此处使用字符类)。
(a-z|A-Z|0-9)*
[a-zA-Z0-9]*
为什么不最后使用限制量词,例如{1,15}?
{1,15}
量词仅应用于左侧的子模式,无论是组,字符类还是文字符号。因此,^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$将有效地将第二个字符类的长度限制[^$%^&*;:,<>?()\"']为1到15个字符。在^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$将“限制”的2子模式无限长度的序列(作为*(和+,也行)可以字符的无限数量的匹配),以1〜15倍,我们仍然不限制的长度 整个输入串 。
^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$
[^$%^&*;:,<>?()\"']
^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$
*
+
前瞻限制如何工作?
在(?=.{1,15}$) 正向前查找 出现后立即^启动的字符串锚。这是一个 零宽度的断言 ,仅在检查其子模式是否与后续字符匹配后才返回true或false。因此,此超前尝试会尝试匹配任何1到15个字符(由于[ 限制量词,但要匹配字符串末尾的换行符(由于$锚点)。如果我们$从前瞻中删除锚,则前瞻仅需要字符串包含1到15个字符,但是总字符串长度可以是任意长度。
(?=.{1,15}$)
^
$
如果输入字符串可以包含换行符序列,则应使用[\s\S]可移植的任何字符正则表达式构造(它将在JS和其他常见的regex风格中使用):
[\s\S]
^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$ ^^^^^^^^^^^^^^^^^