如何在正则表达式中获得嵌套括号

时间:2016-05-10 14:27:22

标签: java regex

我正在使用Java,当输入为PRP I时,我希望实现输出为(NP (PRP I))的代码。 我目前的实现如下:

Pattern pattern = Pattern.compile("\\((.?)\\)");
Matcher matcher = pattern.matcher(noun_phrase);
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

,其输出为NP (PRP I

我知道有一种可能性是计算括号,但我想知道是否有任何方法可以使用regex来获取嵌套括号内的字符串。

3 个答案:

答案 0 :(得分:0)

这应该有效

Pattern pattern = Pattern.compile("\\(.*?\\((.*?)\\)\\)");
Matcher matcher = pattern.matcher("(NP (PRP I))");
while (matcher.find()) {
    System.out.println(matcher.group(1));
}

您可以使用以下网站来试验正则表达式。

https://regex101.com/r/cE0dM7/1

http://leaverou.github.io/regexplained/

https://www.debuggex.com/r/gfVglXkY1Cw5D6Mb

答案 1 :(得分:0)

您需要在群组周围添加其他大括号。此外,您需要确保固定括号之间不匹配括号:

    String noun_phrase = "(NP (PRP I))";
    Pattern pattern = Pattern.compile("\\([^(]*\\(([^)]*)\\)[^)]*\\)");
    Matcher matcher = pattern.matcher(noun_phrase);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

否定的字符类[^(][^)]确保您不要过于热心地匹配括号。

答案 2 :(得分:0)

好吧,因为我不知道你可以用你的parantheses多深,我会建议两种可能的解决方案。

解决方案1:假设深度与问题完全一致。

此正则表达式将起作用:Pattern pattern = Pattern.compile("\\(([^()]*)\\)")

解决方案2:假设深度是任意的(但至少最内层的字符串被parantheses包围)。

在这种情况下,您将不得不进行一些更改。首先,您的模式将如下所示:Pattern pattern = Pattern.compile("(\\(.*)*\\(([^)]*)\\)")。看到不同?你现在有两个组,第一个匹配除了最内层的部分被parantheses包围,第二个组正是你想要的那个。这意味着,在您的循环中,您必须将matcher.group(1)更改为matcher.group(2)。此外,[^)]确保您的小组中没有任何结束语。