2016-12-13 32 views
2

我目前有一個正則表達式/((http:\/\/.+(.net\/|.com\/))|^\/)(.+)$/gm,它提取絕對或相對路徑的相對URL(我知道該路徑將是.com或.net域,或者它可能完全是相對路徑)。不確定如何在我的正則表達式中捕獲斜線符號「/」

它工作正常,除了我不知道如何獲得最後一個捕獲組的斜槓。一些例子:

http://google.com/abcd/efg (captures "abcd/efg", but I want "/abcd/efg") 
http://google.com/abcd (captures "abcd", but I want "/abcd") 
http://google.com/ (Fail) 
http://google.com (Fail) 
/abcd (captures "abcd", but I want "/abcd") 
/(Fail) 

這感覺就像我失去了明顯的東西,任何幫助將不勝感激。

+0

該正則表達式語法看起來不像Java,但更像Javascript。這就是說你可能不得不逃避斜線,例如使用'\ /'。 – Thomas

+0

試試['/(http:\/\/.+(\.net|\.com)|^)(\/.+)$/gm'](https://regex101.com/r/8M1q8P/ 4) –

+0

@WiktorStribiżew'http:// google.com/abc/abc'會導致奇怪的行爲。我認爲OP應該將每個'/ abc'分別捕獲到不同的組中,然後concat – xenteros

回答

1

沒有模式重新排序和分組構造邊界更改,你不能實現這一點。

((http:\/\/.+(.net\/|.com\/))|^\/)第一捕獲組中,/斜槓應該移到第二組(.+)

我建議使用

/(http:\/\/.+(\.net|\.com)|^)(\/.+)$/gm 

regex demo

詳細

  • (http:\/\/.+(\.net|\.com)|^) - 第1組:
    • http:\/\/.+(\.net|\.com) - http://,比LINEBREAK字符,.net.com捕獲到第2組的其它任何1+字符(如果這組是多餘的,與\.(?:net|com)替換(\.net|\.com)
    • | - 或
    • ^ - 串的開始
  • (\/.+) - 第3組(或2):a /斜線和除換行符之外的任何1+字符。
+0

謝謝,這適用於我的目的!我沒有意識到你可以自己開始斷言。 – vsong

1

這個怎麼樣:

(?<!(http:\/\/))\/[^\/]*
每個組是/含和明年/不含之間的文本。

例如

http://google.com/abc/def/ghi會有四組捕獲:

  1. /google.com
  2. /ABC
  3. /DEF
  4. /GHI

只是concatinate所有除第一一個,你會收到你想要的。

相關問題