限制正则​​表达式中的字符长度

我使用以下正则表达式而不限制任何字符长度

var test = /^(az|AZ|0-9)*[^$%^&*;:,?()\""\']*$/ //Works Fine 

在上面,当我试图将字符长度限制为15,如下所示,它会抛出一个错误。

 var test = /^(az|AZ|0-9)*[^$%^&*;:,?()\""\']*${1,15}/ //**Uncaught SyntaxError: Invalid regular expression** 

请帮我做上面的regEx工作,字符数限制为15。

您无法将量词应用于锚点。 相反, 要限制输入字符串的长度 ,请使用锚定在开头的前瞻:

 ^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$ ^^^^^^^^^^^ 

另外,我假设您想要匹配0个或更多字母或数字(az|AZ|0-9)* 。 它应该看起来像[a-zA-Z0-9]* (即在这里使用一个字符类)。

为什么不在最后使用限制量词,如{1,15}

量词仅应用于左侧的子模式,无论是组,字符类还是文字符号。 因此, ^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$将有效地限制第二个字符类的长度[^$%^&*;:,<>?()\"']为1到15个字符。 ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$将”限制“2的序列长度不限的子模式(因为* (和+ ,也可以匹配无限数量的字符))为1到15次,我们仍然不限制整个输入字符串的长度。

前瞻限制如何工作?

(?=.{1,15}$) 正向预测出现在^ start-of-string 锚之后 。 它是一个零宽度断言 ,只有在检查其子模式是否与后续字符匹配后才返回true或false。 因此,这个前瞻尝试匹配任何1到15(由于限制量词 {1,15} )字符,但是在字符串末尾的换行符(由于$ anchor)。 如果我们从前瞻中删除$ anchor,前瞻只需要字符串包含 1到15个字符,但总字符串长度可以是任意字符串。

如果输入字符串可以包含换行符序列,则应使用[\s\S]可移植的任意字符正则表达式构造(它将在JS和其他常见的正则表达式中使用):

 ^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$ ^^^^^^^^^^^^^^^^^