我使用以下正则表达式,不限制任何字符长度:
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**
型
我怎样才能使上面的正则表达式在字符数限制为15的情况下工作?
1条答案
按热度按时间jv2fixgn1#
不能将量词应用于锚点。相反,要限制输入字符串的长度,请使用定位在开头的lookahead:
字符串
另外,我假设您希望用
(a-z|A-Z|0-9)*
匹配0个或更多的字母或数字。它应类似于[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}$)
/(?=.{1,15}\z)
/(?=.{1,15}\Z)
positive lookahead出现在^
/\A
(注意,在Ruby中,\A
是唯一一个只匹配整个字符串开头的锚点)字符串开头anchor的后面。它是一个 * 零宽度Assert *,在检查其子模式是否与后续字符匹配之后,只返回true或false。因此,此lookahead尝试匹配任意1到15个字符(由于限制量词{1,15}
),但字符串末尾的换行符除外(由于$
/\z
/\Z
锚点)。如果我们从lookahead中删除$
/\z
/\Z
锚点,lookahead将只要求字符串 * 包含 * 1到15个字符,但总字符串长度可以是任意的。如果输入字符串可以包含换行符序列,则应使用
[\s\S]
可移植的任意字符正则表达式构造(它将在JS和其他常见正则表达式风格中工作):型