gpt4 book ai didi

java - 如何在Java正则表达式中分割这个 "Tree-like"字符串?

转载 作者:行者123 更新时间:2023-12-01 14:39:22 25 4
gpt4 key购买 nike

这是字符串:

String str = "(S(B1)(B2(B21)(B22)(B23))(B3)())";

son-() 中的内容可能是“”,或者只是 str 的值,或者像该模式一样,递归地,所以 sub-() 是一个子树。

预期结果:

str1 is "(S(B1))"
str2 is "(B2(B21)(B22)(B23))" //don't expand sons of a son
str3 is "(B3)"
str4 is "()"

str1-4 例如数组中的元素

如何分割字符串?

我有一个熟悉的问题:How to split this string in Java regex?但它的答案对于这个来说还不够好。

最佳答案

正则表达式没有足够的能力来解析平衡/嵌套括号。这本质上与解析 HTML 等标记语言相同的问题,其中一致的建议是使用特殊的解析器,而不是正则表达式。

您应该将其解析为一棵树。总体而言:

  • 创建堆栈。
  • 当你点击“(”时,将下一个 block 插入堆栈。
  • 当您点击“)”时,弹出堆栈。

这需要几分钟的时间来编写,并将检查您的输入是否格式正确。

这几乎会立即节省您的时间。为此尝试管理正则表达式将变得越来越复杂,并且几乎不可避免地会失败。

更新:如果您只关心一个级别,那么它可以更简单(无需调试):

List<String> subTreeList = new ArrayList<String>();
String s = getMyString();
int level = 0;
int lastOpenBracket = -1
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '(') {
level++;
if (level == 1) {
lastOpenBracket = i;
}
} else if (c == ')') {
if (level == 1) {
subStreeList.add(s.substring(lastOpenBracket, i);
}
level--;
}
}

I haven't checked it works, and you should debug it. You should also put checks to make sure you

末尾没有中括号,级别 == 1 时没有奇怪的字符;

关于java - 如何在Java正则表达式中分割这个 "Tree-like"字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16141255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com