簡體   English   中英

限制正則表達式中的字符長度

[英]Restricting character length in a regular expression

我正在使用以下正則表達式而不限制任何字符長度:

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

您不能將量詞應用於錨點。 相反,要限制輸入 string 的長度,請使用在開頭錨定的前瞻:

 // 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 個或多個字母或數字與(az|AZ|0-9)*匹配。 它應該看起來像[a-zA-Z0-9]* (即在這里使用字符 class)。

為什么不在最后使用限制量詞,例如{1,15}

量詞僅應用於左側的子模式,無論是組或字符 class 還是文字符號。 因此, ^[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']{1,15}$將有效限制第二個字符 class [^$%^&*;:,<>?()\"']為 1 到 15 個字符。 ^(?:[a-zA-Z0-9]*[^$%^&*;:,<>?()\"']*){1,15}$將“限制” 2 的序列無限長度的子模式(因為* (和+也可以匹配無限數量的字符)到 1 到 15 次,我們仍然不限制整個輸入 string的長度。

前瞻限制如何工作?

(?=.{1,15}$) / (?=.{1,15}\z) / (?=.{1,15}\Z)正前瞻出現在^ / \A之后(注意在Ruby, \A是唯一匹配整個字符串開頭的唯一錨)字符串開始 這是一個零寬度斷言,僅在檢查其子模式是否與后續字符匹配后才返回真或假。 因此,此前瞻嘗試匹配任何 1 到 15 個(由於 限制量詞{1,15} )字符,但在 string 末尾的換行符(由於$ / \z / \Z錨)。 如果我們從前瞻中刪除$ / \z / \Z錨,前瞻將只要求 string包含1 到 15 個字符,但 string 的總長度可以是任意的。

如果輸入 string 可以包含換行符序列,則應使用[\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 ^^^^^^^^^^^^^^^^^^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM