正则表达式匹配两个标签之间的所有内容

时间:2012-10-04 01:47:45

标签: regex

我有一个与此类似的字符串

<td><p>alakjsdlajsdlkj</p><p><b>asdkjalsdkjaskldj</b></p><p>asdjlaksjdlaksjd</p></td>

在标签之间抓取所有内容的正则表达式是什么?

我想抓住以下内容(包括HTML)

<p>alakjsdlajsdlkj</p><p><b>asdkjalsdkjaskldj</b></p><p>asdjlaksjdlaksjd</p>

4 个答案:

答案 0 :(得分:2)

使用正则表达式无法实现此目的。它们只是没有足够的描述性/强大性,主要是因为没有机制来跟踪它所看到的事物的数量。简而言之,这是因为正则表达式机制没有堆栈的概念(它代表有限状态机,而不是下推自动机)。

例如,考虑模式<p>(.*)</p>。如果您使用了贪婪模式(尽可能匹配)并且拥有类似<p>first</p><p>second</p>的字符串,则匹配将为first</p><p>second。如果您使用非贪婪模式(尽可能进行最小匹配)并获得类似<p><p>stuff</p></p>的字符串,您将获得匹配<p>stuff的奖励。因此,两种模式都不能很好地涵盖所有情况(或任何情况)。

正如@kristopher指出的那样,可以使用一种避免在匹配中包含另一个标记的模式,但这只会匹配最里面的标记。

要做到你想要的健壮,你需要一个真正的解析器。其他人已经创建了几个html解析解决方案,或者为了简单的解析需求,你可以编写自己的解析解决方案。

答案 1 :(得分:1)

如果您的标签嵌套,这会变得很乱。

你不能使用html解析器库吗?这样做会更好。

<([^>]+)>([^<]+)</\1>

得到你 包含在尖括号中的任何字符串 加上任何字符,直到下一个标记

这不会处理嵌套或不匹配的标签

<div>test <b>nested</b></div>

只会抓住     &LT; b> 自&lt;以来不是div div>会遇到&lt;的开始b>在遇到自己的标签结束之前。

答案 2 :(得分:1)

如果你不能使用HTML parser并且td和结尾的td位于字符串的开头和结尾:

^<td>(.*)</td>$

答案 3 :(得分:1)

试试这个,它应该匹配最外面的标签并返回组中的内部字符串

^<\w+>(.*)</\w+>$

但它不检查正确的嵌套等。如果可能,请使用适当的框架。