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 |
您应该使用延迟模式作为星号
1 | .* |
改为使用:
1 | "\\[\\[st:.*?\\]\\]" |
为了完整起见,没有非贪婪的明星,你可以匹配开头[[st:,后跟任何非]字符,可能包括字符序列,后跟非]字符,最后跟着]]:
1 | \[\[st:([^\]]*(?:\][^\]]+)*)\]\] |