通过正则表达式获得多个匹配

时间:2017-02-08 18:09:18

标签: java regex pattern-matching

我想通过Matcher& amp;从全局字符串中检索字符串。使用REGEX的模式。

String str = "<strong>ABC</strong>123<strong>DEF</strong>"
Pattern pattern = Pattern.compile("<strong>(.*)</strong>");
Matcher matcher = pattern.matcher(str);

我的问题是,匹配器只给了我一个匹配全局标签内的匹配:

ABC</strong>123<strong>DEF

我的目标是获得2场比赛:

ABC
DEF

非常感谢你的帮助。

2 个答案:

答案 0 :(得分:2)

你需要一个非贪婪的正则表达式:

Pattern pattern = Pattern.compile("<strong>.*?</strong>");

使用?指定非贪婪。这意味着它将匹配它找到的第一个匹配而不是最外面的匹配...

如果你只想要ABCDEF那么你可以使用lookaheads和lookbehinds做这样的事情:

String str = "<strong>ABC</strong>123<strong>DEF</strong>";
Pattern pattern = Pattern.compile("((?<=<strong>).*?(?=</strong>))");
Matcher matcher = pattern.matcher(str);
while(matcher.find())
{
    System.out.println(matcher.group());
}

如果你进行谷歌搜索,你应该能够找到关于前瞻和后视的信息......

答案 1 :(得分:2)

我建议使用JSOUP解析您的HTML代码,而不是正则表达式

    Document doc = Jsoup.parse("<strong>ABC</strong>123<strong>DEF</strong>");

    // select your tag
    Elements elements = doc.select("strong");

    // get the iterator to traverse all elements
    Iterator<Element> it =  elements.iterator();

    // loop through all elements and fetch their text
    while (it.hasNext()) {
        System.out.println(it.next().text());
    }

输出:

ABC
DEF

或将输出作为单个字符串

    Document doc = Jsoup.parse("<strong>ABC</strong>123<strong>DEF</strong>");
    Elements elements = doc.select("strong");
    System.out.println(elements.text());

输出:

ABC DEF

Download Jsoup并将其添加为依赖项