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

Ken*_*nta 2 javascript c# regex

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

var test =  /^(a-z|A-Z|0-9)*[^$%^&*;:,<>?()\""\']*$/ //Works Fine
Run Code Online (Sandbox Code Playgroud)

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

var test =  /^(a-z|A-Z|0-9)*[^$%^&*;:,<>?()\""\']*${1,15}/    //**Uncaught SyntaxError: Invalid regular expression**
Run Code Online (Sandbox Code Playgroud)

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

Wik*_*żew 8

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

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

此外,我假设你想匹配0或更多的字母或数字(a-z|A-Z|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}$) 正向前瞻.它是一个零宽度断言,只有在检查其子模式是否与后续字符匹配后才返回true或false.因此,这个前瞻试图匹配任何1到15(由于限制量词)字符,但是在字符串末尾的新行(由于锚点).如果我们从前瞻中删除锚点,那么前瞻只需要字符串包含 1到15个字符,但总字符串长度可以是任意字符串.^ {1,15}$$

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

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