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

时间:2015-09-09 10:32:24

标签: javascript c# regex

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

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 个答案:

答案 0 :(得分:5)

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

^(?=.{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}$) positive lookahead出现在^字符串开始anchor之后。它是一个零宽度断言,只有在检查其子模式是否与后续字符匹配后才返回true或false。因此,此前瞻尝试匹配任何1到15(由于limiting quantifier {1,15})字符,但在字符串末尾有一个换行符(由于$锚点)。如果我们从前瞻中删除$锚点,那么前瞻只需要包含 1至15个字符的字符串,但总字符串长度可以是任意字符。

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

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