捕获可以匹配多个模式的字符串

时间:2013-05-17 09:16:09

标签: java regex

我有两种类型的字符串:

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

我需要的是抓住有趣的&#34;子串,最好使用一种模式。

到目前为止我已经

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>

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:2)

<b>(.*?)

将始终与<b>匹配,因为.*?与空字符串匹配,并且如果没有,则不会尝试匹配更多。此外,你的正则表达式更多地捕获括号而不是你需要的。

尝试

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

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