我使用以下正则表达式,不限制任何字符长度:
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 的情况下工作?
最佳答案
您不能将量词应用于 anchor 。相反,要限制输入字符串的长度,请使用锚定在开头的前瞻:
// ECMAScript (JavaScript, C++)
^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^
// Or, in flavors other than ECMAScript and Python
\A(?=.{1,15}\z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\z
^^^^^^^^^^^^^^^
// Or, in Python
\A(?=.{1,15}\Z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\Z
^^^^^^^^^^^^^^^
另外,我假设您想将 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 次,并且我们仍然不限制 < 的长度em>整个输入字符串。
先行限制如何工作?
(?=.{1,15}$)
/(?=.{1,15}\z)
/(?=.{1,15}\Z)
positive lookahead出现在^
之后/\A
(注意,在 Ruby 中,\A
是唯一匹配整个字符串开头的 anchor )字符串开头 anchor 。这是一个零宽度断言,仅在检查其子模式是否与后续字符匹配后返回 true 或 false。因此,此前瞻尝试匹配任何 1 到 15 个(由于 limiting quantifier {1,15}
)字符,但在字符串末尾匹配换行符(由于 $
/\z
/\Z
anchor ) 。如果我们删除 $
/\z
/\Z
从lookahead锚定,lookahead只要求字符串包含 1到15个字符,但总字符串长度可以是任意的。
如果输入字符串可以包含换行符序列,则应使用 [\s\S]
可移植的任意字符正则表达式构造(它将在 JS 和其他常见正则表达式风格中工作):
// ECMAScript (JavaScript, C++)
^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^^^^^^^
// Or, in flavors other than ECMAScript and Python
\A(?=[\s\S]{1,15}\z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\z
^^^^^^^^^^^^^^^^^^
// Or, in Python
\A(?=[\s\S]{1,15}\Z)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*\Z
^^^^^^^^^^^^^^^^^^
关于javascript - 限制正则表达式中的字符长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41062703/