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

Posted

技术标签:

【中文标题】限制正则​​表达式中的字符长度【英文标题】:Restricting Character length in Regular expression 【发布时间】:2015-12-05 06:47:16 【问题描述】:

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

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]*[^$%^&amp;*;:,&lt;&gt;?()\"']1,15$ 将有效地将第二个字符类[^$%^&amp;*;:,&lt;&gt;?()\"'] 的长度限制为 1 到 15 个字符。 ^(?:[a-zA-Z0-9]*[^$%^&amp;*;:,&lt;&gt;?()\"']*)1,15$ 将“限制” 2 个无限长度子模式的序列(因为 *(和 + 也可以匹配无限数量的字符)到 1 到 15 次,我们仍然不限制整个输入字符串的长度

前瞻限制如何工作?

(?=.1,15$) / (?=.1,15\z) / (?=.1,15\Z) positive lookahead 出现在 ^/\A 之后(注意在 Ruby 中,\A 是唯一匹配整个字符串开头的锚) start字符串anchor。这是一个零宽度断言,仅在检查其子模式是否与后续字符匹配后才返回真或假。所以,这个前瞻尝试匹配任何 1 到 15 个(由于 limiting quantifier 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
  ^^^^^^^^^^^^^^^^^^

【讨论】:

不太确定你需要这个正则表达式。它将匹配 0 个或多个字母或数字,然后匹配 0 个或多个字符,而不是 $%^&amp;*;:,&lt;&gt;?()"' 集合中的字符。请澄清哪些字符串是有效的(你想匹配)和那些不是。 如果您的字符串中有换行符,请将第一个预读替换为 (?=[\s\S]1,15$) 在 C# 中,当尝试将 regEx 分配给 string 时,上面的那个将不起作用。我需要这样做吗 ^(?=.1,15$)[a-zA-Z0-9]*[^$%^&*;:,?()\""']*$ 如果您使用普通的字符串文字,它将起作用。使用逐字字符串文字,它看起来像var rx = new Regex(@"^(?=.1,15$)[a-zA-Z0-9]*[^$%^&amp;*;:,&lt;&gt;?()""']*$") @Maximus 对比原则是进入你的模式的正确方法。它不是关于限制输入字符串的长度,而是一个特定的验证问题。这个正则表达式在 JS 中不起作用,顺便说一句。

以上是关于限制正则​​表达式中的字符长度的主要内容,如果未能解决你的问题,请参考以下文章

红宝石正则表达式。限制最小和最大字符串长度

正则表达式,限制连续两个横杆(--)

限制为4-16位的正则表达式,怎么写?

正则表达式

8正则表达式

正则表达式