2017-08-25 441 views
1

我最近開始使用正則表達式,但我似乎無法弄清楚這個問題:正則表達式的多個條件

https://xxxx.yyyy.com/en 

對於這個網址我想創建一個正則表達式是唯一有效的,當下面的所有條件都爲真:

  • 不包含 'XXXX'
  • 確實包含/ EN $或/ EN/

時I g ot驗證2個獨立的條件,但似乎無法把它們放在一起

\/en\/|\/en$|^(?!.*(xxxx)).*$ 

你能幫忙嗎?

謝謝!

回答

1

您可以使用

/^(?!.*xxxx).*\/en(?:$|\/)/ 

regex demo

詳細

  • ^ - 字符串的開始
  • (?!.*xxxx) - 不能有xxxx後的任何0+ chars其他tha N線斷字符
  • .* - 比換行符字符以外的任何0或更多字符,儘可能多的
  • \/en - /en
  • (?:$|\/) - 端線或/

所以,如果你想與不止一個學期更換xxxx,使用

注意使y OU可能迫使發動機來匹配他們作爲一個整體的話,如果你添加單詞邊界:

/^(?!.*\b(?:stage|acc)\b).*\/en(?:$|\/)/ 

如果你需要一個完整的字符串匹配,在模式的末尾添加.*

+1

謝謝!這解決了問題。 看起來我有更多的學習要做。 – Martijn

+0

@AhmadBamieh這裏沒有循環,只有1個向前看。 '(?:$ | \ /)'不等於'\ /?$',因爲後者[在/ .../en/more中找不到'en /'](https://regex101.com/ r/ozgsCr/1) –

+0

@AhmadBamieh:我想你沒有注意到我使用的lookahead是在字符串的開頭*錨定*。該檢查僅在字符串開始時進行一次**。你的*你需要繼續進出前瞻性陳述是錯誤的。 –

0

只使用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) 
  • 標誌:全球性的,多
  • 步驟:188
  • Demo
+0

這個正則表達式[不會在字符串末尾加上'en /'](https://regex101.com/r/3YZYYF/2)。此外,不需要第二個預測,你可以在最後加上'。* en \ /?$'而不是'。*',使其成爲一種消費模式 - '^(?!。* xxxx。* )* EN \ /?$'。儘管如此,它不會做所有場景中OP的需求。 –

+0

謝謝。我改變它允許'en/foo'。我正在練習四處看看,測試我可以走多遠。 – linden2015

+0

:)是的,現在它就像我的正則表達式一樣,但是匹配'en /'後面的文本。基本上是一樣的,但是由於消費部分被移動到第二個前瞻部分,所以複雜了1步。請注意,在你的模式中,'en'前面沒有'/',因此可以在'mena /' –