正则表达式匹配多行括号中的文本

joe*_*joe 5 java regex

我有以下文字:

node [
    id 2
    label "node 2"
    thisIsASampleAttribute 43
]
node [
    id 3
    label "node 3"
    thisIsASampleAttribute 44
]
Run Code Online (Sandbox Code Playgroud)

我想将每个节点及其内容分组在括号内,例如:

    node [
    id 2
    label "node 2"
    thisIsASampleAttribute 43
]
Run Code Online (Sandbox Code Playgroud)

不过,我使用以下代码将整个文本分组:

Pattern p = Pattern.compile("node \\[\n(.*|\n)*?\\]", Pattern.MULTILINE);

Matcher m = p.matcher(text);

while(m.find())
{
    System.out.println(m.group());
}
Run Code Online (Sandbox Code Playgroud)

编辑文本:

    node [\n" +
"       id 2\n" +
"       label \"node 2\"\n" +
"       thisIsASampleAttribute 43\n" +
"   ]\n" +
"   node [\n" +
"       id 3\n" +
"       label \"node 3\"\n" +
"       thisIsASampleAttribute 44\n" +
"   ]\n"
Run Code Online (Sandbox Code Playgroud)

Jos*_*ier 3

问题是您仅捕获最后一个字符(.*|\n)*?(因为.?不在捕获组内)。

您可以将捕获组更改为非捕获组,然后用*?捕获组将其包装起来,以便捕获所有匹配项((?:.*?|\n)*?)

示例在这里

Pattern p = Pattern.compile("node \\[\\n((?:.*?|\\n)*?)\\]", Pattern.MULTILINE);
Matcher m = p.matcher(text);
while(m.find())
{
    System.out.println(m.group(1));
}
Run Code Online (Sandbox Code Playgroud)

然而,上面的正则表达式效率相对较低。一种可能更好的方法是将非]字符与否定字符集进行匹配([^\]]*)

示例在这里

Pattern p = Pattern.compile("node \\[\\n([^\\]]*)\\]", Pattern.MULTILINE);
Matcher m = p.matcher(text);
while(m.find())
{
    System.out.println(m.group(1));
}
Run Code Online (Sandbox Code Playgroud)