RegEx用于提取某些<div>标记</div>

时间:2011-06-10 22:46:14

标签: java html regex perl

只提取下面的第二行,适当的Perl或Java正则表达式是什么?它应该找到包含 class =“matchthis”属性的div标记。

<div>Do not match this</div>
<div class="matchthis">MATCH THIS</div>
<div class="unimportant">Do not match this</div>

请不要告诉我使用DOM / Soup / etc。我想知道原始正则表达式是否可以解决上面的简单问题(你将获得答案!)。是的我知道this post所以不要提及它。

3 个答案:

答案 0 :(得分:3)

正如您已经知道的那样,使用正则表达式来解析HTML是一个坏主意。

在这个特定的案例中,我非常确定你真正想要的是:

<div class="lulz">(.*)<\/div>

现在,您想要获得的灵活性越强,您的正则表达式就越难以理解。这是尝试使用正则表达式而不是正确的解析器的危险。例如,假设您希望允许除class之外的其他属性。 类型的函数正则表达式可能如下所示:

<div[^>]*class="[^\"]*lulz[^\"]*".*>(.*)<\/div>

完全可读,对吧? (而且,几乎肯定是非常错误的。)

答案 1 :(得分:1)

如果<div>中没有嵌套代码,则可以使用此

/<div[^>]+class="matchthis"[^>]*>[^>]*<\/div>/

否则你需要知道里面是什么或不同的解决方案(如你所知)。

答案 2 :(得分:0)

如果您只对标签之间的文字感兴趣,而不是整行,则可以使用外观。

有了这个正则表达式,

m{(?<=<div class="matchthis">)([^<]+)(?=</div>)}

你可以在$ 1变量中的标签之间获取文本;请注意,第二组圆括号是捕获括号。

第一组和最后一组圆括号是正面的,它们不会捕获文本。

无论如何,其他人已经给出了建议:不要(ab)在HTML上使用正则表达式。