1

我有两种类型的字符串:

1) "bla bla <a>interesting</a> bla bzzz"
2) "bla bla <b>interesting bla bzzz"

我需要的是捕获“有趣的”子字符串,最好使用一种模式。

到目前为止我有

public static void main(String[] args) {
    Pattern pattern = Pattern.compile("(<a>(.*?)</a>)|(<b>(.*?))");
    String message = "bzzzzzz <a>AaA</a>efwef<b>BbB";

    Matcher matcher = pattern.matcher(message);
    while (matcher.find()) {
        for (int i = 1; i <= matcher.groupCount(); i++) {
            System.out.println(matcher.group(i));
        }
    }
}

我想要的结果是

AaA
BbB

但相反,我得到

<a>AaA</a>
AaA
null
null
null
null
<b>

有任何想法吗?谢谢

4

1 回答 1

2
<b>(.*?)

将始终匹配<b>并且没有其他内容,因为.*?匹配空字符串并且如果不需要,则不会尝试匹配更多内容。此外,您的正则表达式捕获括号的方式比您需要的要多。

尝试

Pattern pattern = Pattern.compile("<a>(.*?)</a>|<b>(\\S*)");

此模式的后半部分匹配.\S之后的非空白字符 ( )序列<b>

于 2013-05-17T09:21:53.200 回答