【问题标题】:RegEx to extract text between a HTML tag正则表达式提取 HTML 标记之间的文本
【发布时间】:2015-03-26 15:51:55
【问题描述】:

我正在寻找一个正则表达式,它必须在不同类型的 HTML 标记之间提取文本。

例如:

<span>Span 1</span> - O/p:跨度 1

<div onclick="callMe()">Span 2</div> - O/p:跨度 2

<a href="#">HyperText</a> - O/p: 超文本

我从here 中找到了这件特别的作品<([A-Z][A-Z0-9]*)\b[^>]*>(.*?)</\1>,但这件作品不起作用。

【问题讨论】:

  • 请准确说明它是如何不工作的。
  • 想给大家推荐一下这个问题的传奇*答案:*.com/questions/1732348/…
  • 最好的办法是使用 HTML 解析器。类似于jsoup.org
  • @Sriram 确切的答案是:不要使用正则表达式来解析 HTML,以防这不够明显。
  • 使用"<([A-Za-z][A-Za-z0-9]*)\\b[^>]*>(.*?)</\\1>"

标签: java regex


【解决方案1】:

您的评论表明您忽略了转义正则表达式字符串中的反斜杠。

如果要匹配小写字母,请将a-z 添加到字符类或使用Pattern.CASE_INSENSITIVE(或将(?i) 添加到正则表达式的开头)

"<([A-Za-z][A-Za-z0-9]*)\\b[^>]*>(.*?)</\\1>"

如果标记内容可能包含换行符,则使用Pattern.DOTALL 或在正则表达式开头添加(?s) 以打开dotall/singleline 模式。

【讨论】:

  • 谢谢。是的,我错过了在表达式中添加反斜杠。我正在该表达式中寻找另一个选项,该选项将递归检查 html 标签并最终获取这些标签之间的文本。 例如: &lt;span&gt;&lt;strong&gt;test&lt;/strong&gt;&lt;/span&gt;希望这次我很清楚。
  • @Sriram。要获得内部标签,您必须在循环中使用上述正则表达式,但我认为您最好为此提出一个新问题。
  • 我无法检索下面标签之间的内容

    Ajay没有手表

    所以请稍等片刻 par> 请提供一些解决方案
【解决方案2】:

这应该适合您的需求:

<([a-zA-Z]+).*?>(.*?)</\\1>

第一组包含标签名称,第二组包含中间值。

【讨论】:

  • 如果有多个标签,则 reg 表达式无效
【解决方案3】:

一种很具体的方式:

(<span>|<a href="#">|<div onclick="callMe\(\)">)(.*)(</span>|</a>|</div>)

但是,这仅适用于这 3 个示例。您需要使用 HTML 解析器。

【讨论】:

  • 这种情况可能与任何 HTML 标记有关。不能说。