-1

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

eg应该与and<a> kljsdlk <b>123</b> df <b>345</b> sdfklj</a>匹配两次,而应该不会产生任何结果(因为没有 wrapping )。<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>
4

3 回答 3

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());
      }
    }
于 2013-04-03T12:05:28.063 回答
0

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

于 2013-04-03T11:49:34.963 回答
0

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

于 2013-04-03T12:04:32.443 回答