您不能将量词应用于锚点。相反, 在开头使用锚定先行:
^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^
另外,我假设您想将0个或多个字母或数字与匹配(a-z|A-Z|0-9)*
。它应该看起来像[a-zA-Z0-9]*
(即在此处使用字符类)。
量词仅适用于左侧的子模式,无论是组,字符类还是文字符号。因此,^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$
将有效地将第二个字符类的长度限制[^$%^&*;:,<>?()\"']
为1到15个字符。在^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$
将“限制”的2子模式无限长度的序列(作为*
(和+
,也行)可以字符的无限数量的匹配),以1?15倍,我们仍然不限制的长度整个输入串 。
在(?=.{1,15}$)
出现后立即^
启动的字符串 。这是一个 零宽度的断言 ,仅在检查其子模式是否与后续字符匹配后才返回true或false。因此,此前瞻尝试匹配任何1到15个字符(由于{1,15}
),但要匹配字符串末尾的换行符(由于$
锚点)。如果我们$
从前瞻中删除锚,则前瞻仅需要字符串 包含 1到15个字符,但是总字符串长度可以是任意长度。
如果输入字符串可以包含换行符序列,则应使用[\s\S]
可移植的任何字符正则表达式构造(它将在JS和其他常见的regex风格中使用):
^(?=[\s\S]{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*$
^^^^^^^^^^^^^^^^^