2017-06-03 119 views
0

這是我不太瞭解的東西。Android的正則表達式不匹配

我想獲得的日期部分從以下字符串:

<th>Elkezdodott</th> 
<td>2016. december 20., 19:29</td> 

所以我用下面的代碼:

System.out.println(html); 
Pattern p = Pattern.compile("\\p{Punct}th\\p{Punct}Elkezdodott\\p{Punct}{2}th\\p{Punct}\\p{Space}*" + 
    "\\p{Punct}td\\p{Punct}" + 
    "(\\d{4}\\p{Punct}\\p{Space}*[a-zA-Z]*\\p{Space}*\\d*\\p{Punct}{2}" + 
    "\\p{Space}*\\d{2}\\p{Punct}\\d{2})\\p{Punct}{2}td\\p{Punct}"); 
Matcher m = p.matcher(html); 
if(m.matches()){ 
    System.out.println("matches"); 
    System.out.println(m.group()); 
} 

此正則表達式根據檢查正則表達式選項似乎是正確的的Android Studio

enter image description here

的System.out.println(HTML)的結果是完全一樣的,你可以在圖像上看到:

06-03 11:49:15.779 4581-5229/hu.lyra.moly_kihivasok I/System.out: <th>Elkezdodott</th> 
06-03 11:49:15.779 4581-5229/hu.lyra.moly_kihivasok I/System.out: <td>2016. december 20., 19:29</td> 

我真不明白的是爲什麼米匹配()返回false。我也試過m.find(),但我得到了同樣的結果。我錯過了什麼?

感謝您的任何建議。

+0

稍後的一些建議可以爲您節省頭痛:正則表達式不是解析HTML的正確工具。 – Henry

+0

謝謝。如果我沒有找到任何解決方案,我會尋找其他的可能性。如果您有任何建議,請不要退縮。 :) – Lyra

回答

1

我已經執行了您的確切示例,它匹配字符串。你做錯的唯一的事情就是沒有將參數傳遞給group()函數。您需要定義您想要匹配的組。在你的情況下,這將是第一個。所以,請使用group(1);

在這裏,您可以在線測試:http://www.tutorialspoint.com/compile_java_online.php?PID=0Bw_CjBb95KQMT09nNnlrU2llOUU


順便說一句。你爲什麼用這種複雜的模式來匹配你的字符串?我不會經常使用\p{},因爲它使得它不可讀。只要使用此:

"<th>Elkezdodott</th>\\n<td>(\\d{4}\\.\\s*[a-zA-Z]+\\s*\\d{1,2}\\.,\\s*\\d{2}:\\d{2})</td>" 

順便說一下^ 2,則不應使用正則表達式來解析HTML。改爲使用HTML解析器。周圍有很多。如果你試圖用正則表達式解析HTML,你很快會遇到重大問題(嵌套,錯誤的HTML,如缺少結束標籤等)。

+0

感謝您的答案。不幸的是,改變參數並不能改變m.matches()返回false的事實。這就是我不明白的地方,因爲當你在線測試時,它應該可以工作。 – Lyra

+0

是的,你說得對,我應該將它改爲HTML解析器。這就是我要做的。 :) – Lyra