2012-09-04 56 views
1

我有一個網頁轉換爲字符串,我試圖從該行中提取三個數字。Java正則表達式 - 僅從網頁中提取數字

<td class="col_stat">1</td><td class="col_stat">0</td><td class="col_stat">1</td> 

從線以上,我已經把它提取的第一個「1」用這個

String filePattern = "<td class=\"col_stat\">(.+)</td>"; 
    pattern = Pattern.compile(filePattern); 
    matcher = pattern.matcher(text); 
    if(matcher.find()){ 
     String number = matcher.group(1); 
     System.out.println(number); 
    }  

現在我想要做的就是提取0,最後1,但只要我嘗試編輯它上面的正則表達式只是在控制檯上輸出完整的網頁。任何人有任何建議? 感謝

回答

2

正則表達式匹配是貪婪的,試試這個,而不是(只想找(\d+)而不是(.+)(相匹配的一切,直到最後</td>):

String text = 
    "<td class=\"col_stat\">1</td>" + 
    "<td class=\"col_stat\">0</td>" + 
    "<td class=\"col_stat\">1</td>"; 
String filePattern = "<td class=\"col_stat\">(\\d+)</td>"; 
Pattern pattern = Pattern.compile(filePattern); 
Matcher matcher = pattern.matcher(text); 
while (matcher.find()) 
{ 
    String number = matcher.group(1); 
    System.out.println(number); 
} 

在相關說明中,我完全同意其他人的建議,即使用更加結構化的方法來解釋HTML。

2

考慮到使用上的HTML/XML正則表達式是一個臭名昭著的疑難雜症(見這裏的definitive answer),我會建議使用HTML解析器這樣可靠(如JTidy - 雖然這是一個HTML漂亮打印機,它也提供了一個DOM接口文檔)

+0

Downvoted爲何鏈? –

1
<td class=\"col_stat\">(.+)</td> 

這個正則表達式是貪婪的。如果你想使之與起作用 - 更改爲:

<td class=\"col_stat\">(\\d+?)</td> 

,我寧願建議使用XPath對於此類匹配,見撒克遜和TagSoup

0

這是因爲你的匹配器greedy。你需要一個非貪婪的匹配器來解決這個問題。

String text = "<td class=\"col_stat\">1</td><td class=\"col_stat\">0</td><td class=\"col_stat\">1</td>"; 

    String filePattern = "<td class=\"col_stat\">(.+?)</td>"; 
    Pattern pattern = Pattern.compile(filePattern); 
    Matcher matcher = pattern.matcher(text); 
    while (matcher.find()) { 
     String number = matcher.group(1); 
     System.out.println(number); 
    } 
0

試試這個正則表達式:

<td class="col_stat">(\d+)[^\d]+(\d+)[^\d]+(\d+) 

此執行以下操作:

  1. 搜索你開始字符串
  2. 選擇小數鏈
  3. 跳過任何非小數點
  4. 選擇小數鏈
  5. 跳過任何非小數
  6. 選擇小數