这是输入字符串:
<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所以不要提及它。
答案 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>)