regex 限制正则表达式中的字符长度

ghhaqwfi  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(98)

我使用以下正则表达式,不限制任何字符长度:

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的情况下工作?

jv2fixgn

jv2fixgn1#

不能将量词应用于锚点。相反,要限制输入字符串的长度,请使用定位在开头的lookahead:

// 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
^^^^^^^^^^^^^^^

字符串
另外,我假设您希望用(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和其他常见正则表达式风格中工作):

// 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
  ^^^^^^^^^^^^^^^^^^

相关问题