我有这个字符串
<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标签
答案 0 :(得分:3)
您可以使用此简单的正则表达式捕获<div>
标记的最后一次出现。无论<div>
标记是否具有任何属性,该方法都有效。
.*(<div[^>]*>.*?<\/div>)
说明:
.*
->贪婪地匹配所有内容,直到遇到<div
标记为止,这意味着它匹配了除最后一个div标记以外的所有内容<div[^>]*>
->这与div标签匹配,可以选择具有任何属性.*?
->非贪婪地匹配任何文本,并在结束div标签之前停止<\/div>
->匹配结束的div标签如果您希望正则表达式仅匹配最后一个<div>
标记,则可以使用\K
运算符来重置所有不想包含在完全匹配项中的匹配项,然后更改正则表达式,
.*\K(<div[^>]*>.*?<\/div>)
让我知道这是否对您有用。
答案 1 :(得分:2)
通常,Regex是一个很好的工具,但是不适用于XML / HTML解析。我建议您使用编程语言和适当的工具来解析基于DOM的文件并获取最后的<div>
。
如果您坚持使用Regex来处理这种简单情况,这里是一个Regex,用于查找最后一个<div>
(带有或不带有类)及其内容:
.*(<div(?:\s+class="[^>]*"\s*)?>.*?<\/div>).*
在Regex101尝试一下。
<div>
匹配,直到第一个</div>
与.*(<div>.*?<\/div>).*
匹配-这相当容易,但是它也与嵌套的divs匹配。让我们定义匹配的div
中可以包含的内容。(?:\s+class="[^>]*"\s*)
是一个可选的非捕获组,它定义了div可以包含一个或多个类。如果您希望完全匹配仅包含结果。您必须使用正面的眼神并找到先前的内容-但这有点限制性(Regex101),因为解决方案基于以下事实:
始终"div2">
位于它之前:
(?<="div2">)(<div(?:\s+class="[^>]*"\s*)?>.*?<\/div>)