Android正则表达式不匹配

时间:2017-06-03 09:41:19

标签: java android regex jsoup

这是我不太懂的东西。

我想从以下字符串中获取日期部分:

<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 选项,此正则表达式似乎是正确的:

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>

我真正不理解的是 m.matches()返回false的原因。我也试过 m.find(),但我得到了相同的结果。我错过了什么吗?

感谢您的任何建议。

1 个答案:

答案 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,如缺少结束标记等)。