JAVA如何简单的提取可能存在多层花括号嵌套的内容?

RT。问题背景是在C语言代码中,提取for循环中相应循环体的内容
举个例子

 #include<stdio.h>

int main(){
    ...1
    for(int i=0;i<10;i++){

        while(i<5){
            ...2
        }

        for(int j=0;j<10;j++){
            ...3
        }
    }
    ...4
    for(int r=0;r<5;r++){
        ....5
    }
    ...6
}

要提取出 第一个
while(i<5){
...2
}
for(int j=0;j<10;j++){
...3
}
第二个...3
第三个...5

7个回答

楼主,单个for循环内容好提取,嵌套for循环在循环深度未知的情况下会比较麻烦的,首先包住循环体的花括号对应就比较麻烦(因为嵌套循环,花括号内还有许多未知的花括号)。
如果知道循环深度的话,可以很快提取到你想要的文本内容。否则通过一个正则一步到位我觉得比较难。我能想到的解决办法是,先匹配单层的for循环,获取到循环体内容后,
将整个文本中单层for循环replace为空。用新文本再去匹配单层for循环,递归实现。方法比较笨并且不能直接捕获到嵌套for内的内容,楼主自己忖度。

lml0703
莫瑜 嗯谢谢,最后我是通过一次括号匹配建了棵语法树进行存取。
接近 3 年之前 回复

你可以点击所要提取内容的最外层的花括号来提取内容

这题目什么意思?
是把C代码作为文本输入?把所有括号去掉还是指定提取第几个括号?

lml0703
莫瑜 问题解决啦,谢谢啦!
接近 3 年之前 回复
package com.nirvana.test;

import java.util.ArrayList;
import java.util.List;

public class DemoTest {

    private static final String s = "int main(){\n" +
            "    ...1\n" +
            "    for(int i=0;i<10;i++){\n" +
            "\n" +
            "        while(i<5){\n" +
            "            ...2\n" +
            "        }\n" +
            "\n" +
            "        for(int j=0;j<10;j++){\n" +
            "            ...3\n" +
            "        }\n" +
            "    }\n" +
            "    ...4\n" +
            "    for(int r=0;r<5;r++){\n" +
            "        ....5\n" +
            "    }\n" +
            "    ...6\n" +
            "}";

    public static void main(String[] args) {
        printAll(s);
    }

    public static void printAll(String src) {
        System.out.println("####################################################################################");
        System.out.println(src);
        System.out.println("####################################################################################");
        List<String> list = getSons(src);
        for (String s : list) {
            printAll(s);
        }
    }

    public static List<String> getSons(String src) {
        List<String> list = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        boolean start = false;
        int deep = 0;
        for (char c : src.toCharArray()) {
            if (!start) {
                if (c == '{') {
                    start = true;
                    deep++;
                }
                continue;
            } else {
                if (c == '{') {
                    deep++;
                    sb.append(c);
                } else if (c == '}') {
                    deep--;
                    if (deep == 0) {
                        list.add(sb.toString());
                        start = false;
                        sb = new StringBuilder();
                    } else {
                        sb.append(c);
                    }
                } else {
                    sb.append(c);
                }
            }
        }
        return list;
    }

}

lml0703
莫瑜 这几天没看CSDN,问题已经解决了,最后还是括号匹配搞的。谢谢
接近 3 年之前 回复
zhangyueshan
zhangyueshan 随便写写,拿去爽~
接近 3 年之前 回复

你可以吧{和}替换成“”或者递归截取从{到};

谢谢,我原来想如果用 栈什么的 进行括号匹配,感觉过于笨重。所以上来问问能不能用正则或者其他简单的方法。
这是第一次提问,提问后被几个水贴的人搞的有点恼火,这几天就没有看CSDN。
问题已经解决了。谢谢各位。

fitandread
fitandread 怎么解决的,可以帮助一下吗?现在项目中也有一个类似的需要
一年多之前 回复

如何用正则处理未知括号层数,提取最外层大括号

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐