RegEx - 匹配父标记中的多个标记对

时间:2013-04-03 11:46:04

标签: java regex tags

我正在尝试在Java中使用正则表达式来匹配<b><number></b>对中包含的<a><\a>形式的所有字符串。

e.g。 <a> kljsdlk <b>123</b> df <b>345</b> sdfklj</a>应与<b>123</b><b>345</b>匹配两次,而<v> kljsdlk <b>123</b> df <b>345</b> sdfklj</v>则不会产生任何结果(因为没有包装<a></a>)。

以下代码是我目前最好的结果:

        Pattern MY_PATTERN = Pattern.compile("(<a>.*(<b>[0-9]*<\\\\b>)?.*<\\\\a>)");

    Matcher m = MY_PATTERN.matcher("<a> skdjlkasjflkj <b>200<\\b> sldfhjhfj d lkj b <b>300<\\b> fhih 9 09 <\\a>");
    while (m.find()) {
        for (int i=0; i< m.groupCount() ;i++){
            String s = m.group(i);
            System.out.println(s);
        }
    }

此代码结果为:

<a> skdjlkasjflkj <b>200<\b> sldfhjhfj d lkj b <b>300<\b> fhih 9 09 <\a>
<a> skdjlkasjflkj <b>200<\b> sldfhjhfj d lkj b <b>300<\b> fhih 9 09 <\a>

我希望它能导致:

<b>200<\b>
<b>300<\b>

3 个答案:

答案 0 :(得分:1)

为什么不首先匹配<a>.*</a>,然后查找<b>[0-9]*</b>?

    Pattern p1 = Pattern.compile("(<a>.*</a>)");
    Pattern p2 = Pattern.compile("<b>\\d*</b>");
    Matcher m1 = m1 = p1.matcher("<a> kljsdlk <b>123</b> df <b>345</b> sdfklj</a>");
    if (m1.find()) {
      Matcher m2 = p2.matcher(m1.group());
      while (m2.find()) {
        System.out.println(m2.group());
      }
    }

答案 1 :(得分:0)

问题是您已匹配模式中的整个字符串。您应该只为内部标记创建一个模式。这将提供正确的匹配字符串

答案 2 :(得分:0)

如果Java支持任意长度的lookbehinds,那么可能能够做到这一点。没有它,仅在正则表达式中这是不可能的。此外,由于它是HTML / XML,因此可以更直观地使用专用于此类的库。