2012-09-27 37 views
0

我的解析器出現問題。我想讀一個網站上的圖像鏈接,這通常工作正常。但是今天我得到了一個包含特殊字符的鏈接,而通常的正則表達式不起作用。Java正則表達式不能使用特殊字符

這就是我的代碼的樣子。

Pattern t = Pattern.compile(regex.trim()); 

Matcher x = t.matcher(content[i].toString()); 
if(x.find()) 
{ 
    values[i] = x.group(1); 
} 

這是HTML的一部分,引起麻煩

<div class="open-zoomview zoomlink" itemscope="" itemtype="http://schema.org/Product"> 
<img class="zoomLink productImage" src=" 

http://tnm.scene7.com/is/image/TNM/template_335x300?$plus_335x300$&amp;$image=is{TNM/1098845000_prod_001}&amp;$ausverkauft=1&amp;$0prozent=1&amp;$versandkostenfrei=0" alt="Produkt Atika HB 60 Benzin-Heckenschere" title="Produkt Atika HB 60 Benzin-Heckenschere" itemprop="image" /> 
</div> 

這是我使用來獲得在src屬性的一部分,正則表達式:

<img .*src="(.*?)" .*> 

我相信它與鏈接中的所有特殊字符有關。但我不確定如何逃脫所有這些。我已經嘗試

Pattern.quote(content[i].toString()) 

但結果是一樣的:沒有發現。

回答

2

.字符通常只匹配之外的所有新行字符。因此,如果img-tag中有換行符,模式將不匹配。

使用Pattern.compile(..., Pattern.DOTALL)或在(?s)之前預先設定您的模式。

在dotall模式中,表達式。匹配任何字符,包括一個 行結束符。默認情況下,該表達式不符合行 終止符。

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/regex/Pattern.html#DOTALL

+0

Thx男人:)現在它的工作。認爲'.'匹配一切。不知道換行符不包含:) – Ogofo

0

實際上你應該使用<img\\s\\.*?\\bsrc=["'](\\.*?)["']\\.*?>(?s)修飾符。

0

你的正則表達式應該是這樣的:

String regex = "<img .*src=\"(.*?)\" .*>"; 
0

這可能是由標籤內的換行造成的。這個。角色不符合它。

您是否考慮過不使用正則表達式來解析HTML?使用正則表達式進行HTML解析是非常脆弱的構造。請考慮使用像JSoup這樣的解析庫。