2010-04-04 24 views
0

如何匹配的URL字符串是這樣的:Java的正則表達式匹配器問題

IMG SRC =「https://stackoverflow.com/a/b/c/d/someimage.jpg

僅有的則是變量,域名和文件擴展名(JPG)是固定的?

下面的代碼似乎並不工作:

Pattern p = Pattern.compile("<img src=\"http://stachoverflow.com/.*jpg"); 
    // Create a matcher with an input string 
    Matcher m = p.matcher(url); 
    while (m.find()) { 
    String s = m.toString(); 
    } 
+1

也許是因爲它實際上是用計算器一'k',而不是'h'? ;)此外,正確的方法將使用HTML解析器:http://stackoverflow.com/search?q=parse+html+with+regex – BalusC 2010-04-04 04:17:08

+0

這是一個問題,正好在正則表達式的範圍內,很多HTML解析不適合正則表達式,但我沒有看到用這種方式提取圖像路徑的問題。 – Michael 2010-04-04 05:09:01

+2

@Michael:''可能會成爲一個問題,具體取決於正則表達式的用途...... – 2010-04-04 08:01:47

回答

1

首先,我會使用group()方法來檢索匹配的文本,而不是toString()。但它可能只是你想要的URL部分,所以我會使用圓括號來捕獲該部分,並致電group(1)檢索它。

其次,我不會假設src<img>標記中的第一個屬性。例如,在SO上通常會有一個class屬性。您希望添加一些內容來匹配中介屬性,但要確保它不能匹配標籤的末尾。 [^<>]+可能就足夠了。

第三,我會使用比.*更具限制性的內容來匹配未知部分和路徑。總有那麼你會發現在一行中兩個URL,這樣的機會:

<img src="http://so.com/foo.jpg"> blah <img src="http://so.com/bar.jpg"> 

在這種情況下,在你的正則表達式將縮小差距的.*,給你一個地方你想兩個賽。再次,[^<>]*可能會受到限制。

還有其他幾個潛在的問題。屬性值是否總是用雙引號括起來,或者它們可能是單引號的,或者根本不引用? =周圍會有空白嗎?元素和屬性名稱總是小寫嗎?

...我可以繼續。正如已經多次指出的那樣,正則表達式並不是使用HTML的正確工具。他們通常可以處理像這樣的簡單任務,但重要的是要了解他們的侷限性。

這裏是我的修訂您正則表達式的版本(如Java字符串字面):

"(?i)<img[^<>]+src\\s*=\\s*[\"']?(http://stackoverflow\\.com/[^<>]+\\.jpg)" 
+0

@Alan:使用'[^ ​​<>]'時仍然會匹配''。這只是一個例子,爲什麼這是如此危險... – 2010-04-04 08:12:19

+1

@chris:是的,我只是介紹了有效的,善意的HTML中發現的一些最常見的問題。潛在問題的完整列表將填補厚厚的一本書。 – 2010-04-04 09:23:51

2

有一對夫婦的匹配你給樣本串正則表達式的問題。不過,你已經很近了。這是你的代碼固定,使其工作:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TCPChat { 

    static public void main(String[] args) { 
    String url = "<img src=\"http://stackoverflow.com/a/b/c/d/someimage.jpg\">"; 
    Pattern p = Pattern.compile("<img src=\"http://stackoverflow.com/.*jpg\">"); 
    // Create a matcher with an input string 
    Matcher m = p.matcher(url); 
    while (m.find()) { 
     String s = m.toString(); 
     System.out.println(s); 
    } 
    } 
} 
+0

我會用'。* \。jpg'結束正則表達式。這是一件小事,但它阻止匹配的東西,如「myimage.notreallyajpg」 – mpen 2010-04-04 06:18:17

+0

你需要雙重逃避反斜槓。你的例子不會編譯(如果這是**實際的**問題,你應該說,而不是「它不工作」)。 – BalusC 2010-04-04 06:25:02