2009-08-04 84 views
2

如果該變量不存在,我需要從URL中提取變量或獲取空字符串。使用正則表達式從url中提取查詢字符串值

僞代碼:

String foo = "http://abcdefg.hij.klmnop.com/a/b/c.file?foo=123&zoo=panda"; 
String bar = "http://abcdefg.hij.klmnop.com/a/b/c.file"; 

,當我跑我的正則表達式我想123在第二首例和空字符串。

我正在嘗試這個作爲我的替換.*?foo=(.*?)&?.*$1代替這個,但是當foo =不存在時這不起作用。

我不能只是做一個匹配,它必須是一個替代。

+0

哪種語言? – 2009-08-04 01:45:36

回答

3

你可以試試這個:

[^?]+(?:\?foo=([^&]+).*)? 

如果有參數,第一個參數被命名爲「富」,它的價值將在組#1被捕獲。如果沒有參數,則正則表達式仍然會成功,但我無法預測訪問捕獲組時會發生什麼。一些可能性:

  • 它將包含一個空字符串
  • 它將包含空引用,這將被自動轉換爲
    • 空字符串
    • 單詞「空」
  • 你的應用程序會拋出異常,因爲組#1沒有參加比賽。

這個正則表達式匹配您提供的示例字符串,但如果有一個參數列表不包含「foo」,或者如果「foo」不是第一個參數,它將不起作用。這些選項也可以適應,假設捕獲組的工作。

1

我認爲你需要做一個匹配,然後一個正則表達式。這樣,你可以提取值,如果它存在,並替換爲「」,如果它不是。這樣的事情:

if(foo.match("\\?foo=([^&]+)")){ 
    String bar = foo.replace("\\?foo=([^&]+)", $1); 
}else{ 
    String bar = ""; 
} 

我還沒有測試正則表達式,所以我不知道它是否會工作。

0

在Perl中,你可以這樣做:

s/[^?*]*\??(foo=)?([\d]*).*/$2/ 

這將讓一切都交給了?開始,然後隔離foo,抓住組中的數字,讓剩下的部分落在可能的位置。

0

使用正則表達式時有一條重要規則:不要嘗試將不必要的處理加入其中。有時候只能用一個正則表達式才能完成。有時使用主機編程語言更爲明智。

Marius的回答使用了這個規則:不是找到一種複雜的方式來替代只有它的東西,最好使用你的編程語言來檢查模式的存在,並且只替換如有必要。

相關問題