正则表达式以可选方式查找最后一次出现

时间:2018-12-01 13:47:04

标签: regex

我有这个字符串

<p class="p1">lalala</p><div><div class="div2"><div><p>lalala22</p></div></div></div>

我想找到<div><div .*?>中的最后一个

我尝试过此正则表达式

(<div>|<div .*?>)(?!.*(<div>|<div .*?>))

(<div>(?!.*<div>)|<div .*?>(?!.*<div .*?>))

,但是它将总是最终找到<div class="div2">而不是最后一个<div>

该如何解决?如何使用带有这样的可选选项的负前瞻?

编辑 明确地说,我想要的正则表达式的最终结果是<div><p>lalala22</p></div>,这就是为什么我想找到最后一个起始div标签

的原因

2 个答案:

答案 0 :(得分:3)

您可以使用此简单的正则表达式捕获<div>标记的最后一次出现。无论<div>标记是否具有任何属性,该方法都有效。

.*(<div[^>]*>.*?<\/div>)

说明:

  • .*->贪婪地匹配所有内容,直到遇到<div标记为止,这意味着它匹配了除最后一个div标记以外的所有内容
  • <div[^>]*>->这与div标签匹配,可以选择具有任何属性
  • .*?->非贪婪地匹配任何文本,并在结束div标签之前停止
  • <\/div>->匹配结束的div标签

Demo1

如果您希望正则表达式仅匹配最后一个<div>标记,则可以使用\K运算符来重置所有不想包含在完全匹配项中的匹配项,然后更改正则表达式,

.*\K(<div[^>]*>.*?<\/div>)

Demo2

让我知道这是否对您有用。

答案 1 :(得分:2)

通常,Regex是一个很好的工具,但是不适用于XML / HTML解析。我建议您使用编程语言和适当的工具来解析基于DOM的文件并获取最后的<div>

如果您坚持使用Regex来处理这种简单情况,这里是一个Regex,用于查找最后一个<div>(带有或不带有类)及其内容:

.*(<div(?:\s+class="[^>]*"\s*)?>.*?<\/div>).*

Regex101尝试一下。

  1. 这个想法开始与最后一个<div>匹配,直到第一个</div>.*(<div>.*?<\/div>).*匹配-这相当容易,但是它也与嵌套的divs匹配。让我们定义匹配的div中可以包含的内容。
  2. (?:\s+class="[^>]*"\s*)是一个可选的非捕获组,它定义了div可以包含一个或多个类。
  3. 计算时间很长-在我的示例中需要716步才能完成4种用法。您可能希望使用编程语言来获得更好,更稳定的结果。

如果您希望完全匹配仅包含结果。您必须使用正面的眼神并找到先前的内容-但这有点限制性(Regex101),因为解决方案基于以下事实:  始终"div2">位于它之前:

(?<="div2">)(<div(?:\s+class="[^>]*"\s*)?>.*?<\/div>)