2017-10-20 46 views
0

我正在嘗試編寫一個正則表達式,它可以匹配沒有特定格式的URL。我嘗試過濾的網址不應包含ID,即40個十六進制大寫字符。使用正則表達式查找沒有特定格式的URL

例如,如果我有以下網址:

/dev/api/appid/A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5A1B2C3D4E5/users

/dev/api/apps/list

/dev/api/help/apps/applicationname/apple/osversion/list/

(網址是編造的,但這個想法是有一些端點與40長ID和一些端點,以及一些端點在總字符中的確很長)

我想確保正則表達式只能匹配最後2個URL,而不是第一個。

我寫了下面的正則表達式,

\S+(?:[0-9A-F]{40})\S+

,並匹配做在他們長ID終點,而是跳過應當被過濾掉的人。如果我試圖否定的正則表達式,

\S+(?![0-9A-F]{40})\S+

它的所有端點相匹配,因爲一些網址的長度是比什麼ID應該是(40個字符)更大。

如何使用正則表達式來過濾掉我需要的網址?

回答

1

試試這個正則表達式:

^(?!.*\/[0-9A-F]{40}\/).*$

Click for Demo

說明:

  • ^ - 斷言字符串的開始/ URL
  • (?!.*\/[0-9A-F]{40}\/) - Negative Lookahead檢查是否存在/後跟正好40個HEX字符,然後是字符串中某處的/。因爲,它是一個負面的向前看,任何包含這種模式的字符串/網址將不會匹配。
  • .* - 比賽0+除換行符
  • $任意字符的出現 - 斷言字符串
+0

謝謝,解釋幫助很大。到目前爲止,消極的向前看是最難理解的東西。 – iamseiko

1
^((?![A-F0-9]{40}).)*$ 

使用負前瞻匹配不具有連續40個十六進制數字的任何行。 Try it here.

+0

真棒,是完美工作的結束。我稍微將它改爲 '^((?![A-F0-9] {40})\ S)* $' 因爲不應該有空格。 – iamseiko