如何在java中使用正则表达式解析div?

如何在java中使用正则表达式解析div?,java,regex,Java,Regex,可能重复: 我在使用java解析标记时遇到问题 目标: 我的目标是解析完整的div标记及其所有内容,即使它包含子标记 就像从HTML <h2>some random text</h2> <div id="outerDiv"> some text <div> some more text </div> last text </div> <div> some ra

可能重复:

我在使用java解析标记时遇到问题

目标:

我的目标是解析完整的div标记及其所有内容,即使它包含子标记

就像从HTML

<h2>some random text</h2>
<div id="outerDiv">
  some text
      <div>
          some more text
      </div>
  last text
</div>
<div> some random div <b>bold</b></div>
我想解析它的所有内部内容,直到它的结束标记,即:

<div id="outerDiv">
      some text
          <div>
              some more text
          </div>
      last text
    </div>
但我现在得到的是这种形式或任何其他随机格式,根据我对表达式的更改:

请帮助我改进我的正则表达式,以便完美地解析具有特定id的div及其内容

为了安全起见,我用了很多括号来表达:

((<div.*(class=\"afs\")(.)*?>)((.)*?)(((<div(.)*?>)((.)*?)((</div>){1}))*?)((</div>){1}))
以下是我的java代码:

package rexp;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Rexp {

    public static void main(String[] args) {

        CharSequence inputStr = "asdasd<div class=\"af\">sasa<div><div><div class=\"afs\">as</div>qwessa</div></div></div>asd";


        Pattern pattern = Pattern.compile("((<div.*(class=\"afs\")(.)*?>)((.)*?)(((<div(.)*?>)((.)*?)((</div>){1}))*?)((</div>){1}))");
        Matcher matcher = null;
        matcher = pattern.matcher(inputStr);

        if (matcher.find()) {
            System.out.println("Matched "+matcher.group(1));
        } else {
            System.out.println("Not Matched");
        }
    }
}

我认为正则表达式是错误的工具。我会考虑使用一个Lexel/PalsScript库,或者仅仅使用第三方HTML解析库。一个快速的谷歌显示了几个例子。

正则表达式不适合于HTML解析,因为HTML不是一个语法。您最好使用适当的HTML解析器库,例如或


另请参阅以获取更多Java HTML解析器参考。

一个显而易见的答案~。为什么不帮自己一个忙,使用一个合适的解析器呢?正则表达式不适合解析HTML。如果OP只需要解析一个标记,我认为正则表达式在这里是完全可以接受的,它们可以根据具体情况来完成这项工作。正则表达式无法匹配OP要求的结束标记和开始标记。我不希望出现错误,所以我要用正则表达式来解决一个问题,这个问题在数学上是不可能用正则表达式来解决的。那是。。有点矛盾;虽然我同意你的回答,html解析器可以围绕正则表达式构建@不,你不能。你可能可以用反向引用来做,你链接的答案是使用一个循环,但是这不再是一个正则表达式,它很好地证明了这一点。。从数学上讲,用正则表达式正确解析HTML/XML是不可能的。@好吧,我不知道我们谈论的是没有反向引用支持的古代正则表达式引擎:-这当然使正则表达式能够解析不规则的东西:@FailedDev:1。使用由附加逻辑支持的正则表达式可能很好。在链接中,大循环和switch语句不是正则表达式的一部分:-2。仅仅因为你能做点什么,并不意味着你应该:-@thkala 2-我知道:这就是为什么我同意你的答案