2013-02-28 19 views
1

我試圖提取標題元素內的文本並忽略其他所有內容。無法找出正則表達式問題

我已經看了這些文章,但他們似乎並沒有幫助:\
Regular expression to extract text between square brackets
String Pattern Matching In Java
Java Regex to get the text from HTML anchor (<a>...</a>) tags

主要的問題是我無法理解的應答者說的話同時試圖破解我自己的代碼。

以下是我通過閱讀Pattern article中的Java API進行管理的內容。

<title>(.*?)</title> 

這是我的代碼來返回標題。

String title = null; 
Matcher match = Pattern.compile("[<title>](.*?)[</title>]").matcher(this.webPage); 
try{ 
    title = match.group(); 
} 
catch(IllegalStateException e) 
{ 
    e.printStackTrace(); 
} 

我收到IllegalStateException異常,其中這樣說:

java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:485) 
    at java.util.regex.Matcher.group(Matcher.java:445) 
    at BrowserModal.getWebPageTitle(BrowserModal.java:21) 
    at BrowserTest.main(BrowserTest.java:7) 

線21將是 「標題= match.group();」

+1

請不要使用RegEx解析HTML。 [只需相信我們](http://stackoverflow.com/a/1732454)。改用HTML或XML解析器。 – 2013-02-28 05:26:20

+0

馬特是對的。正則表達式不是正確的工具。舉一個例子來說明它有什麼問題,請考慮評論的可能性:'<! - current - >產品列表' – VGR 2013-03-01 12:47:33

回答

2

試試這個: -

 String title = null; 
     String subjectString = "<title>TextWithinTags</title>"; 
     Pattern titleFinder = Pattern.compile("<title[^>]*>(.*?)</title>", Pattern.DOTALL | Pattern.CASE_INSENSITIVE); 
     Matcher regexMatcher = titleFinder.matcher(subjectString); 
     while (regexMatcher.find()) { 
      title = regexMatcher.group(1); 
     } 

編輯: - 正則表達式解釋: -

[^>] *: - 任何但是>是可以接受的存在。這是因爲我們可以在標籤中使用屬性。

(。*?): - Dot表示除換行符以外的任何字符。 *?表示重複任意次數,但儘可能少。

有關正則表達式的更多詳細信息,請檢查this

+0

這個工作很好,你能分解這個模式,以便我能理解它嗎? (只是正則表達式) – RyanDawkins 2013-02-28 05:46:39

+0

答案更新!正則表達式解釋:) – SudoRahul 2013-02-28 06:15:41

3

What are the pros and cons of the leading Java HTML parsers?列出了一堆HTML解析器。將您的HTML解析爲DOM,然後使用getElementsByClassName("title")獲取標題元素,並通過查看應該是文本節點的子元素來獲取文本內容。


title = match.group(); 

這是失敗,因爲group()返回整個匹配的文本。 group(1)將僅返回第一個括號組的內容。


[<title>](.*?)[</title>] 

方括號只是打破它。 [<title>]將匹配單詞「標題」中的角括號或字母中的任何單個字符。

<title>(.*?)</title> 

較好,但將只匹配的稱號,是在同一行(因爲.沒有,默認情況下,匹配換行,並不會匹配諸如

<title lang=en>Foo</title> 

的微小變化也將無法正確找到標題在HTML像

<html> 
<head> 
<!-- <title>Old commented out title</title> --> 
<title>Spiffy new title</title> 
+0

+1,帶有挑剔。調用'find()'從不應用正則表達式(如[RJ的答案](http://stackoverflow.com/)所示),因此'group()'調用失敗一個/20938分之15128085))。但是,一旦這個問題得到解決,就像你所說的那樣,它會以*返回錯誤的結果的方式失敗。 – 2013-02-28 07:57:46

+0

@AlanMoore,挺對的。 – 2013-03-01 00:50:45

-1

這得到在只有一行的Java代碼的標題:

String title = html.replaceAll("(?s).*<title>(.*)</title>.*", "$1"); 

此正則表達式假定HTML是「簡單」,並與「DOTALL」開關(?s)(這意味着點也匹配新行字符),它將使用多行輸入,甚至多行標題。

+0

實際上,'(?s)'激活DOTALL模式(也稱爲單線模式)。也許你在想Ruby?但它使用'(?m)'而不是'(?s)'。 – 2013-02-28 08:09:14

+0

@AlanMoore不,我在想Java。如果沒有這種切換,正則表達式不會匹配跨越換行符的文本。 – Bohemian 2013-02-28 08:25:50

+1

這是真的。麻煩的是,它會匹配所有的換行符。每個'。*'的實例都可以並且將首先吞噬整個剩餘的文檔,只是不得不再次回溯到開頭。 – 2013-02-28 08:58:11