我的 Web 應用程式允許用戶指定符合以下限制的自定義 URI 路徑組件:
- 所有字符必須小寫。
- 長度至少為 2 個字符。
- 第一個字符必須匹配
[a-z]。 - 最后一個字符必須匹配
[0-9a-z]。 - 所有其他字符必須匹配
[0-9a-z_\-]。 - 和字符不能連續存在 2 個或更多
-。_- 即字串不能包含
--、、、或。___--_
- 即字串不能包含
我已經很容易地在正則運算式中實作了前 5 條規則:
^[a-z][0-9_a-z\-]*[0-9a-z]$
...但是我不知道如何在單個正則運算式中實作最后一條規則。
我以為我會首先嘗試更改正則運算式,使其不匹配--(如中a--b) - 我認為這可能是一個負面的前瞻性,因為它斷言該正則運算式不包含--(對嗎?):
Lookahead 和lookbehind,統稱為“lookaround”,是零長度斷言,就像行的開始和結束,以及單詞錨的開始和結束。[...] 不同之處在于環視實際上匹配字符,但隨后放棄匹配,僅回傳結果:匹配或不匹配。這就是為什么它們被稱為“斷言”。它們不消耗字串中的字符,而僅斷言匹配是否可能
但是在不同的地方添加(?!\-\-)正則運算式(在 regex101.com 上),或者作為一個lookbehind(?<!\-\-)不會導致像not-matcha--b這樣的字串。
即所有這些模式foo--bar在不應該匹配時都匹配。
(?!\-\-)^[a-z][0-9_a-z\-]*[0-9a-z]$
^(?!\-\-)[a-z][0-9_a-z\-]*[0-9a-z]$
^[a-z](?!\-\-)[0-9_a-z\-]*[0-9a-z]$
^[a-z](?!\-\-)(?:[0-9_a-z\-]*)[0-9a-z]$
^[a-z][0-9_a-z\-]*(?!\-\-)[0-9a-z]$
^[a-z][0-9_a-z\-]*(?<!\-\-)[0-9a-z]$
uj5u.com熱心網友回復:
您可以在匹配字串開頭的 az 之后立即放置否定前瞻。
由于您不想匹配 - 和 - 的任何組合,您可以使用 2 個字符類(?!.*[_-][_-])
由于該[_-][_-]部分可以出現在字串中的任何位置,因此您可以在它之前.*選擇匹配任何字符。
如果您省略.*斷言僅在當前位置運行,在這種情況下將在匹配字串開頭的 az 之后。
^[a-z](?!.*[_-][_-])[0-9_a-z-]*[0-9a-z]$
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/491483.html
上一篇:提取第一個下劃線后的所有數字值
