一尘不染

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

javascript

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

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。


阅读 4583

收藏
2020-04-25

共1个答案

一尘不染

您不能将量词应用于锚点。相反, 要限制输入字符串的长度,请 在开头使用锚定先行:

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

另外,我假设您想将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个字符,但是总字符串长度可以是任意长度。

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

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