在本文中:
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++;
}
}
}
答案 0 :(得分:3)
量词*(0或更多)默认是贪婪的,所以它匹配第二个]。
尝试更改为不情愿的模式匹配:
String currentPattern = "\\[\\[st:.*?\\]\\]";
答案 1 :(得分:2)
您应该使用延迟模式作为星号
.*
改为使用:
"\\[\\[st:.*?\\]\\]"
答案 2 :(得分:1)
为了完整起见,没有非贪婪的明星,你可以匹配开头[[st:,后跟任何非]字符,可能包括字符序列,后跟非]字符,最后是]]:
\[\[st:([^\]]*(?:\][^\]]+)*)\]\]