找到双方括号内的所有子序列

时间:2015-11-16 16:59:04

标签: java regex

我的输入文字如下:

..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]]

仅作为结果。如何实现我的目标?

2 个答案:

答案 0 :(得分:1)

使用\[\[.*?]]正则缓慢且.默认情况下与新行不匹配,如果解析非常长的字符串,则可能会遇到回溯限制耗尽的问题。

我建议使用基于展开循环方法的正则表达式:

\[{2}([^\]]*(?:\](?!\])[^\]]*)*)\]{2}

甚至更短

\[{2}([^\]]*(?:\][^\]]+)*)\]{2}

请参阅regex demo 1demo 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个或多个符号
  • (?:\][^\]]+)* - 匹配0个或更多个序列...
    • \] - 单个],后跟
    • [^\]]+ - 除]
    • 以外的1个或多个符号
  • \]{2} - 恰好匹配2 ]个符号。

与基于.*?的正则表达式的区别在于匹配变得更加线性,因此正则表达式模式更快,更不容易出错。

答案 1 :(得分:1)

此任务的正则表达式如下

\[\[(.*?)]]

它使用[[

关闭的任何字符串搜索]]后跟

以下是DEMOexplanation

相关问题