[英]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.