2017-06-03 11 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スタジオ

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> 

私は本当に理解していない、何が理由メートルです。 matches()は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

関連する問題