我嘗試做的第一件事,是讓重碼匹配我不想要的東西。這樣一來,我就可以將其翻轉為不接受相同的輸入。這就是我想出的這個詞組的第一部分。
- 接受所有9位數的數字,其中所有9位數是相同的(沒有破折號)。"^(d)1{8}$". 這個運算式如預期的那樣作業(如圖所示。(https://regex101.com/r/Ez8YC3/1).
- 第二個運算式也應該這樣做,破折號的格式如下 xxx-xx-xxxx。"^(d)1{8}$". 這個運算式如預期般作業(如圖所示。https://regex101.com/r/bodzIX/1)。
現在我想做的是將它們結合在一起以尋找兩個條件。然而,當我這樣做的時候,它似乎打破了,只匹配9位數的數字,這些數字在整個程序中都是相同的,并帶有破折號。"^(d)1{2}-(d)1{1}-(d)1{3}$|^(d)1{8}$". 這可以在這里看到。https://regex101.com/r/lPnksf/1。
我在這里可能有點超前了,但是為了盡可能地展示我的作業,我還試著分別翻轉這些重碼,也沒有達到預期的效果。
- 條件#1翻轉了
- 條件#1被翻轉。"^(?!(d)1{8})$". 可以在這里看到。https://regex101.com/r/ed51yk/1. 。
- 條件#2翻轉了。"^(?!(d)1{2}-(d)1{1}-(d)1{3})$". 可以在這里看到。https://regex101.com/r/UYfoMK/1。
我希望這兩個運算式(當翻轉時)能夠匹配任何9位數的數字(有或沒有破折號),其中所有數字都不相同。然而,這種情況根本沒有發生。
這是最終的運算式。
這是我最后想出的重碼,它顯然沒有做我所期望的事情。"^(?!(d)1{2}-(d)1{1}-(d)1{3})$|^(?!(d)1{8})$". 可以在這里看到。https://regex101.com/r/9eHhF5/1
最后,我想把這2個運算式與這個運算式結合起來(已經按原定計劃作業)。"^(?!000|666|9dd)d{3}-(?!00)dd-(?!0000)dddd$". 可以在這里看到。https://regex101.com/r/AdRI8i/1。
我對regex還是很陌生的,我真的想知道為什么我不能簡單地用(?!...)來包裹條件以匹配相反的條件。
預先感謝你
uj5u.com熱心網友回復:
通過這個Regex你可以匹配你不想要的社會安全號碼:
^(?:(d)1{8})|(?:(d)2{2}-2{4})$
通過這個詞條,你只匹配你想要的東西:
^(? !(? :(d)1{8})|(? :(d)2{2}-2{2}-2{4}).*$
uj5u.com熱心網友回復:
你要做的不是翻轉,而是反轉重碼邏輯。
是的,為了反轉模式邏輯,你應該使用一個負數的lookahead,但是有一些注意事項。
首先,$ 字串末尾的錨:如果它在 "正 "重詞的末尾,它也必須被移到反向模式中的lookahead。因此,你的^(?!(d)1{8})$重詞必須寫成^(?!(d)1{8}$)。你的第二個詞條也是如此。
接下來,請注意每一個后續的捕獲組都會得到一個遞增的ID號,所以當你用OR |運算子 "連接 "模式時,你不能保持相同的backreferences。你必須調整這些ID,以反映它們在新的鉸鏈中的新值。
因此,你想匹配一個字串,它與^(?!000|666|9dd)d{3}-(?!00)dd-(?!0000)ddd$ 首先(讓我們注意dd=d{4}),然后你可以用lookaheads添加限制:
(?!(d)1{8}$)- 如果從當前位置開始,立即匹配相同的9個數字,然后字串結束,則匹配失敗(?!(d)22-(d)2-(d)2{3}$)- (注意ID遞增的延續)如果從當前位置開始,立即匹配到與第一個相同的3位數字,-,相同的2位數字,-,相同的5位數字,然后字串結束,則匹配失敗。
所以,按照你的邏輯,你可以用
^(?!(d)1{8}$) (? (d)22-(d)2<3}$) (? !000|666|9dd)d{3}-(? !00)dd-(?!0000)d{4}$
請看regex演示
由于lookaheads是非消耗性模式,即在匹配它們的模式序列后,regex索引仍在之前的相同位置,3個lookaheads都將在字串的開始處被嘗試(見^錨)。如果開頭的三個負數查找頭中的任何一個失敗,整個字串的匹配將立即失敗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/311795.html
標籤:
