【问题标题】:Finding repeating <br>'s between a certain <span>在某个 <span> 之间找到重复的 <br>
【发布时间】:2015-11-08 09:00:09
【问题描述】:

我有以下 HTML 字符串:

<span class='together'>line one,<br><span class='indent'>line two.</span><br>Line three,<br><span class='indent'>line four,<br>line five,<br>line six,<br>line seven;<br>line eight.<br>Line nine;<br>line ten,<br>line eleven,<br>line twelve.</span><br>Line thriteen,<br><span class='indent'>line fourteen,<br>line fifteen,<br>line sixteen,<br>line seventeen,<br>line eighteen.</span></span>

我正在尝试找到一个正则表达式,该表达式将找到介于 &lt;span class='indent'&gt; 和关闭 &lt;/span&gt; 之间的所有 &lt;br&gt;&lt;span class='together'&gt; 封装了整个问题,应该被忽略。

目前我能做的最好的事情是:&lt;span class='indent'&gt;.*?(&lt;br&gt;).*?&lt;\/span&gt; 这根本不起作用。这个抓取的第一个 &lt;br&gt;&lt;span&gt; 之外,然后它跳过了我想要的一堆其他 &lt;br&gt; (See here)。

这可能吗?我应该改用&lt;span class='indent'&gt;(.*?)\&lt;\/span&gt;,然后再解析捕获的组吗?

如您所知,我的正则表达式知识非常有限。

【问题讨论】:

  • 一般情况下,不要使用正则表达式解析HTML,使用解析器。
  • 您使用哪种语言?
  • 这很快。感谢该链接@JonathonReinhart :)
  • @hjpotter92 用于 Android 应用程序的 Java。我从 JSON 转储中获取此内容,然后尝试将(格式化)字符串放入 TextView。 Html.fromHtml 忽略跨度,我认为您不能将自己的样式添加到文本视图以获取跨度。

标签: java android regex


【解决方案1】:

在你写的其他答案的 cmets 中

跨度之间的内容将只有一个&lt;br&gt;标签,没有其他HTML...

如果在&lt;span class='indent'&gt; 之前只有&lt;br&gt; 标签/没有其他标签,请尝试使用lookbehind。只允许有限的重复,因此需要对跨度内的最大长度设置一个限制。

(?s)(?<=<span class='indent'>(?:(?!</?span).){0,9999}?)<br>

刚刚选择了 9999,您可能需要更高的值,具体取决于输入。 Demo at regexplanet(单击 Java)。 (?!&lt;/?span). 负前瞻用于向后看时不跳过跨度。

这仅适用于您的样本等数据,不适用于任何嵌套跨度。在这种情况下使用解析器。

【讨论】:

  • 感谢您的工作泡泡。我将此标记为正确答案,因为它确实符合我的要求。但是,解析器可能是解决我的问题的“正确”方法。事实上,我最终使用正则表达式来查找缩进范围的内容,然后做了一些简单的查找和替换处理
  • 不客气@Ampers,谢谢!听起来你找到了处理它的最佳方法。好吧,如果解析器或正则表达式 - 我认为这取决于问题以及是否解析任意 html 或您自己的。
猜你喜欢
  • 2014-01-27
  • 2018-09-04
  • 2020-01-29
  • 2012-04-29
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 2015-03-22
  • 2011-06-01
相关资源
最近更新 更多