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