正则表达式查找分隔符之间包含的字符串

时间:2009-03-26 14:48:55

标签: java regex delimited-text

在本文中:

text text text [[st: aaa bbb ccc ddd eee fff]] text text
text text [[st: ggg hhh iii jjj kkk
lll mmm nnn]] text text text

我正在尝试在[[st:和结束]]

之间获取文本

我的程序应输出:

aaa bbb ccc ddd eee fff  (first match)
ggg hhh iii jjj kkk \n lll mmm nnn(second match)

但是我只能让它返回第一个[[st:和last]],所以只有一个匹配而不是两个。有什么想法吗?

这是我的代码:

package com.s2i.egc.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class TestRegex {

    /**
     * @param args
     */
    public static void main(String[] args) {

        String bodyText = "text text text [[st: aaa bbb ccc ddd eee fff]] text text text text [[st: ggg hhh iii jjj kkk\n lll mmm nnn]] text text text";

        String currentPattern = "\\[\\[st:.*\\]\\]";

        Pattern myPattern = Pattern.compile(currentPattern, Pattern.DOTALL);

        Matcher myMatcher = myPattern.matcher(bodyText);

        int i = 1;

        while (myMatcher.find()) {
          String match = bodyText.substring(myMatcher.start() + 5, myMatcher.end() - 3);
          System.out.println(match + " (match #" + i + ")");
          i++;
        }                           


    }

}

3 个答案:

答案 0 :(得分:3)

量词*(0或更多)默认是贪婪的,所以它匹配第二个]。

尝试更改为不情愿的模式匹配:

String currentPattern = "\\[\\[st:.*?\\]\\]";

答案 1 :(得分:2)

您应该使用延迟模式作为星号

.*  

改为使用:

"\\[\\[st:.*?\\]\\]"

答案 2 :(得分:1)

为了完整起见,没有非贪婪的明星,你可以匹配开头[[st:,后跟任何非]字符,可能包括字符序列,后跟非]字符,最后是]]:

\[\[st:([^\]]*(?:\][^\]]+)*)\]\]