我使用以下正则表达式而不限制任何字符长度
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。
答案 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]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^^^^^^^