这是我不太懂的东西。
我想从以下字符串中获取日期部分:
<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 的检查RegExp 选项,此正则表达式似乎是正确的:
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>
我真正不理解的是 m.matches()返回false的原因。我也试过 m.find(),但我得到了相同的结果。我错过了什么吗?
感谢您的任何建议。
答案 0 :(得分:1)
我已经执行了您的确切示例并且它与字符串匹配。你做错的唯一一件事就是不将参数传递给group()
函数。您需要定义要匹配的组。在你的情况下,这将是第一个。因此,请使用group(1);
。
顺便说一下。为什么你使用这么复杂的模式来匹配你的字符串?我不会经常使用\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,如缺少结束标记等)。