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

Regex to find strings contained between separators

在本文中:

1
2
3
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:和那个以...结尾]之间得到文本

我的程序应该输出:

1
2
3
aaa bbb ccc ddd eee fff  (first match)
ggg hhh iii jjj kkk
 lll mmm nnn(second match)

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

这是我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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
 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++;
        }                          


    }

}

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

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

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


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

1
.*

改为使用:

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


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

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