提问者:小点点

用于无限次获取括号内的括号的正则表达式[重复]


所以我有一个文本字符串,比如说“hello world()(foo bar)(foo bar 2(这看起来很舒服))(foo bar 3…”是否有一个正则表达式模式可以用来获取括号,并在括号中包含第n个深度的任何括号。因此,匹配将是“()”“(foo-bar)”(foo-bar 2(这看起来很舒服)),


共1个答案

匿名用户

Java中的正则表达式风格不像其他一些风格那样支持递归。相反,您可以编写自己的方法,该方法将仅在以下情况下从字符生成字符串:

要知道当前处理的字符是否在括号内,我们可以创建计数器来检查括号平衡(您也可以将其视为嵌套级别的计数器)。简而言之:如果我们看到更多的,那么我们在未闭合(打开)括号部分,所以我们应该将当前字符添加到结果字符串中。

使用这种想法,我们的代码可以如下所示:

String str = "hello world () (foo bar) (foo bar 2 (this looks cozy)) (foo bar 3...)";
List<String> result = new ArrayList<>();

int parenthesisNestingLevel = 0;
StringBuilder sb = new StringBuilder();
for (char ch : str.toCharArray()) {
    if (ch == '(') {
        parenthesisNestingLevel++;
        sb.append(ch);
    } else if (ch == ')') {
        parenthesisNestingLevel--;
        sb.append(ch);
        if (parenthesisNestingLevel == 0) {
            result.add(sb.toString());
            sb.delete(0, sb.length());//reset sb
        }
    } else if (parenthesisNestingLevel > 0) {//we are inside unclosed parenthesis
        sb.append(ch);
    }
}

result.forEach(System.out::println);

输出:

()
(foo bar)
(foo bar 2 (this looks cozy))
(foo bar 3...)