首页 > 解决方案 > 需要有关如何制作正则表达式以及为什么这个不起作用的帮助

问题描述

这是文本:

<div class="center-content">  <h2> <a href="https://lapiedradesisifo.com/2019/11/04/la-silenciosa-linea-del-idioma-no-hablado/" class="l:3207185" > La silenciosa línea del idioma no hablado </a>

我的代码:

Pattern p = Pattern.compile("<div class=\"center-content\"> *<h2> <a.{10,200} >(.{50,200})</a>");
Matcher m = p.matcher(text);

StringBuilder sb = new StringBuilder();
while(m.find()){
    sb.append(m.group(1) + "\n");
}

System.out.println(sb.toString());

这是我期望在屏幕上打印的内容:

"La silenciosa línea del idioma no hablado"

但是什么都没有打印出来,我真的不知道为什么,因为我已经用类似的例子尝试过它并且它有效。

老实说,我在一些帮助下得到了这个正则表达式,但我仍然不太明白它是如何工作的,非常感谢你对这个正则表达式的帮助。

标签: javaregex

解决方案


正如Mike在评论中指出的那样,使用适当的 HTML 解析器来处理 HTML 输入。但是,如果您对正则表达式的工作方式感兴趣,我将尝试简要描述一下。

当前模式

您当前的模式如下

<div class=\"center-content\">- 从字面上匹配<div class="center-content">

*<h2>- 匹配零次到无限次之间的任何字符,后跟<h2>

<a.{10,200} >- 匹配<a后跟 10 到 200 次之间的任何字符,然后是字符>

(.{50,200})- 这个匹配任何字符 50 到 200 次并将其捕获到一个组中。顺便说一句,这是您通过调用在代码中访问的内容m.group(1)

</a></a>-从字面上匹配

简化版

但是,如果您的目标只是捕获包含在a元素中的文本,则可以简化正则表达式, <a\s+href=.*?>(.*?)</a>其工作方式如下:

<a\s+href=- 火柴<a href=

.*?>- 匹配 URL 部分a(0 到无限次之间的任何字符,尽可能少)元素,后跟>

(.*?)-捕获介于两者之间的任何内容><(尽可能少的次数) - 调用.group(1)获取它

</a>- 火柴</a>


推荐阅读