我的输入文字如下:
..some_text0 [[some_text1]] some_text2 [[some_text3]] some_text4 ....
我想提取双方括号中包含的所有文本,或者我想单独获取组:
some_text1
some_text3
我尝试了这个解决方案:
Matcher m = Pattern.compile("\\[\\[.*\\]\\]").matcher(line_input);
while (m.find()) {
System.out.println("Found: " + matcher.group());
}
但这打印了我:
[[some_text1]] some_text2 [[some_text3]]
仅作为结果。如何实现我的目标?
答案 0 :(得分:1)
使用\[\[.*?]]
正则缓慢且.
默认情况下与新行不匹配,如果解析非常长的字符串,则可能会遇到回溯限制耗尽的问题。
我建议使用基于展开循环方法的正则表达式:
\[{2}([^\]]*(?:\](?!\])[^\]]*)*)\]{2}
甚至更短
\[{2}([^\]]*(?:\][^\]]+)*)\]{2}
请参阅regex demo 1和demo 2。
这是Java demo:
String str = "some_text0 [[some_text1]] some_text2 [[some_text3]] some_text4";
Pattern ptrn = Pattern.compile("\\[{2}([^\\]]*(?:\\][^\\]]+)*)\\]{2}");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
结果:
some_text1
some_text3
正则表达式细分:
\[{2}
- 恰好匹配2 [
个符号[^\]]*
- 匹配]
(?:\][^\]]+)*
- 匹配0个或更多个序列...
\]
- 单个]
,后跟[^\]]+
- 除]
\]{2}
- 恰好匹配2 ]
个符号。与基于.*?
的正则表达式的区别在于匹配变得更加线性,因此正则表达式模式更快,更不容易出错。
答案 1 :(得分:1)