我最近開始使用正則表達式,但我似乎無法弄清楚這個問題:正則表達式的多個條件
https://xxxx.yyyy.com/en
對於這個網址我想創建一個正則表達式是唯一有效的,當下面的所有條件都爲真:
- 不包含 'XXXX'
- 確實包含/ EN $或/ EN/
時I g ot驗證2個獨立的條件,但似乎無法把它們放在一起
\/en\/|\/en$|^(?!.*(xxxx)).*$
你能幫忙嗎?
謝謝!
我最近開始使用正則表達式,但我似乎無法弄清楚這個問題:正則表達式的多個條件
https://xxxx.yyyy.com/en
對於這個網址我想創建一個正則表達式是唯一有效的,當下面的所有條件都爲真:
時I g ot驗證2個獨立的條件,但似乎無法把它們放在一起
\/en\/|\/en$|^(?!.*(xxxx)).*$
你能幫忙嗎?
謝謝!
您可以使用
/^(?!.*xxxx).*\/en(?:$|\/)/
詳細
^
- 字符串的開始(?!.*xxxx)
- 不能有xxxx
後的任何0+ chars其他tha N線斷字符.*
- 比換行符字符以外的任何0或更多字符,儘可能多的\/en
- /en
子(?:$|\/)
- 端線或/
所以,如果你想與不止一個學期更換xxxx
,使用
注意使y OU可能迫使發動機來匹配他們作爲一個整體的話,如果你添加單詞邊界:
/^(?!.*\b(?:stage|acc)\b).*\/en(?:$|\/)/
如果你需要一個完整的字符串匹配,在模式的末尾添加.*
。
只使用lookarounds:
^(?!.*xxxx)(?=.*\/en(?:$|\/)).*
^ // start of line
(?!.*xxxx) // look ahead and don't match anything then 'xxxx'
(?= // look ahead and match
.*\/en // anything then '/en'
(?:$|\/) // end of line OR a slash
) // end of look ahead
.* // match all (can be omitted if testing lines)
這個正則表達式[不會在字符串末尾加上'en /'](https://regex101.com/r/3YZYYF/2)。此外,不需要第二個預測,你可以在最後加上'。* en \ /?$'而不是'。*',使其成爲一種消費模式 - '^(?!。* xxxx。* )* EN \ /?$'。儘管如此,它不會做所有場景中OP的需求。 –
謝謝。我改變它允許'en/foo'。我正在練習四處看看,測試我可以走多遠。 – linden2015
:)是的,現在它就像我的正則表達式一樣,但是匹配'en /'後面的文本。基本上是一樣的,但是由於消費部分被移動到第二個前瞻部分,所以複雜了1步。請注意,在你的模式中,'en'前面沒有'/',因此可以在'mena /' –
謝謝!這解決了問題。 看起來我有更多的學習要做。 – Martijn
@AhmadBamieh這裏沒有循環,只有1個向前看。 '(?:$ | \ /)'不等於'\ /?$',因爲後者[在/ .../en/more中找不到'en /'](https://regex101.com/ r/ozgsCr/1) –
@AhmadBamieh:我想你沒有注意到我使用的lookahead是在字符串的開頭*錨定*。該檢查僅在字符串開始時進行一次**。你的*你需要繼續進出前瞻性陳述是錯誤的。 –