java - 需要有关如何制作正则表达式以及为什么这个不起作用的帮助
问题描述
这是文本:
<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"
但是什么都没有打印出来,我真的不知道为什么,因为我已经用类似的例子尝试过它并且它有效。
老实说,我在一些帮助下得到了这个正则表达式,但我仍然不太明白它是如何工作的,非常感谢你对这个正则表达式的帮助。
解决方案
正如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>
推荐阅读
- angular - JHipster - Angular Universal 集成示例(问题和想法)
- scala - Spark 二进制数据源与 sc.binaryFiles
- c++ - 使用带有外部 dll 的 c++ 构建器应用程序
- c++ - 如何使用 SDL2 调整图像大小
- javascript - 如何使用输入标签 HTML 从用户那里获取的图像?
- unity3d - Unity 2D:使图像完全变黑
- java - 如何连接号码和姓名?
- python - 使用 if 子句和 diff() 应用/Lambda
- oracle - 云上的 DBA 实践
- python - 如何让我的 Anaconda 环境“识别”/激活 anaconda/envs/envname/lib 中的 .so 文件?