2017-05-23 27 views
1

我試圖提取url字符串的特定部分。一個簡單的例子是尋找以「who」或「what」開頭的任何字符串,其長度爲5或10個字符,並停止匹配任何非字母數字字符串正則表達式與字符數限制,特定起始字符和終止符匹配

例如:

http://www.test.com/who12/foo - >who12 // 5焦炭比賽開始誰,在/

http://www.test.com/who1234567/foo結束 - >who1234567 // 10字符的比賽開始誰,在/

結束- >what1 // 5字符字符串的結束比賽

http://www.test.com/what1?param=true - >what1 // 5字符匹配上破?

我試過設置的東西了 here

它在5個和10個字符方案中的/上斷開,但在?情況下失敗,並且匹配位於字符串的末尾。

有沒有更簡單的方法來完成這個?

回答

1

我建議使用

\.com\/\K(?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})? 

this regex demo

使用的捕獲方法,如果不支持PCRE \K匹配復位操作:

\.com\/((?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})?) 

this regex demo

詳細

  • \.com\/ - 比賽.com/以便找到必要的左手邊文本,您需要
  • (?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})? - 兩個備選方案和可選的5個字符之後它們中的:
    • who[^\/?\s]{2} - who隨後以比/?和空白
    • |其他2個字符 - 或
    • what[^\/?\s] - what接着用1除/,?和空白之外的字符,然後...
  • (?:[^\/?\s]{5})? - 可選/,?和空白以外的5個字符。
+0

這也可以簡化一點長度相同的前綴:https://regex101.com/r/9N5a55/1 –

+0

@ john_ryan:你的意思是*後綴*(交替的右邊是什麼)。但是,方法是一樣的。 –

+0

我沒有我認爲所以我的意思是說,如果前綴長度相同(在我發佈了誰的情況下,爲什麼都是3),則不需要添加'[^ \ /?\ s] {2}'(或一些變體)到每個前綴以滿足最小長度,他們可以直接或直接在一起。無論如何,我認爲你的答案對於不同的前綴長度(即誰和什麼)更有用 –

0

請嘗試使用以下正則表達式。

正則表達式:(?=.{5,10})(?:who|what)(?:[^\/?\s]*)

說明:

  • (?=.{5,10})字符串的長度先行檢查爲5〜10個字符。

  • (?:who|what)匹配文字whowhat

  • [^\/?\s]*是否定字符類別/,?, \s (whitespace)。因此除這些之外的其他字符將被匹配。

Regex101 Demo

+0

非常感謝,任何建議5或10位數完全匹配?我嘗試用'(?=(?:。{5} |。{10})$)'交換第一個段。(從另一個SO問題看,但它似乎不起作用。 –

+0

也不處理一些重要的案例,請參閱:https://regex101.com/r/5yZBNa/1 –

+0

@john_ryan:好吧,所以你想**完全** 5或10位數字? – Rahul

相關問題