您不能将量词应用于锚点。相反,要限制输入字符串的长度,请使用锚定在开头的前瞻:
// 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倍,我们仍然不限制的长度整个输入串。
前瞻限制是如何工作的?
在(?=.{1,15}$)
/ (?=.{1,15}\z)
/(?=.{1,15}\Z)
正向前查找出现右后^
/ \A
(Ruby的音符,\A
是唯一锚仅匹配启动整个字符串)启动的字符串锚。它是一个零宽度断言,仅在检查其子模式是否与后续字符匹配后才返回 true 或 false。所以,这个先行尝试匹配任何1至15(由于限制性量词 {1,15}
)字符,但在所述串的端部的换行权(由于$
/ \z
/\Z
锚)。如果我们去掉$
/ \z
/\Z
从超前锚杆,超前只需要字符串包含 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
^^^^^^^^^^^^^^^^^^