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

IT技术 javascript c# regex
2021-01-12 19:06:47

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

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个回答

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

// 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
  ^^^^^^^^^^^^^^^^^^
如果您使用普通的字符串文字,它将起作用。使用逐字字符串文字,它看起来像var rx = new Regex(@"^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()""']*$").
2021-03-14 19:06:47
如果您的字符串中有换行符,请将第一个前瞻替换为(?=[\s\S]{1,15}$).
2021-03-16 19:06:47
@Maximus 对比原则是适合您的模式的正确方法。不过,这与限制输入字符串长度无关,而是一个特定的验证问题。这个正则表达式在 JS 中不起作用,顺便说一句。
2021-03-21 19:06:47
在 C# 中,当尝试将 regEx 分配给 string 时,上述方法不起作用。我需要这样做 ^(?=.{1,15}$)[a-zA-Z0-9]*[^$%^&*;:,<>?()\""']*$
2021-03-27 19:06:47
不太确定你需要这个正则表达式。它将匹配 0 个或多个字母或数字,然后匹配 0 个或多个除$%^&*;:,<>?()"'集合中的字符以外的字符请说明哪些字符串有效(您要匹配)和哪些无效。
2021-04-04 19:06:47