RegEx用于提取一些<div>标签</div>

时间:2011-06-15 20:46:35

标签: java regex perl

这是输入字符串:

<div class="matchthis">Orange</div>
<div class="dontmatch">One</div>
<div class="matchthis" id="hurdle">Lemon</div>
<div class="dontmatch">Two</div>
<div id="hurdle" class="matchthis">Peach</div>

我想在下面输出(包含<div>的所有class="matchthis"代码

<div class="matchthis">Orange</div>
<div class="matchthis" id="hurdle">Lemon</div>
<div id="hurdle" class="matchthis">Peach</div>

此Java RegEx <div class=\"matchthis\">(.*?)(?=</div>) 仅输出以下内容:

<div class="matchthis">Orange</div>

请帮助改进RegEx以获得所需的输出。

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

3 个答案:

答案 0 :(得分:3)

如果标签不能嵌套,则可以这样做。

您可以在属性的两面添加(?:\s+\w+=(?:"[^"]*"|'[^']*'|\S*))*

不要认为这比一个好的解析器更快。

答案 1 :(得分:2)

Pattern.compile(
   "<div class=\"matchthis\"(?:[^>\"']|\"[^\"]*\"|'[^']*')*>(.*?)(?=</div>)",
   Pattern.CASE_INSENSITIVE | Pattern.DOTALL)

要打破它,

 (?:[^>\"']|\"[^\"]*\"|'[^']*')*
由于

匹配以下任意数量

 (?: ... )*
由于

非引用非标记关闭者

[^>\"']

或双引号属性值

\"[^\"]*\"

或单引号属性值

'[^']*'

Pattern.DOTALL表示您的.*?将允许div正文中的换行符。

Pattern.CASE_INSENSITIVE会使它正确处理HTML元素名称的大小写折叠,但如果您的默认语言环境是土耳其语,则可能会在<DİV>周围出现一些奇怪现象(请注意点缀的I)。

答案 2 :(得分:0)

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