lml0703
「已注销」
采纳率100%
2017-11-29 09:27 阅读 3.5k
已采纳

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

10

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条回答 默认 最新

  • 已采纳
    qq_27323623 Yirujet 2017-11-30 02:21

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

    点赞 评论 复制链接分享
  • qq_34254894 qq_34254894 2017-11-29 09:42

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

    点赞 评论 复制链接分享
  • littlebai07 littlebai07 2017-11-30 05:56

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

    点赞 评论 复制链接分享
  • zhangyueshan zhangyueshan 2017-11-30 14:59
    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;
        }
    
    }
    
    
    点赞 评论 复制链接分享
  • dsxjinzhiqiang dsxjinzhiqiang 2017-12-02 05:45

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

    点赞 评论 复制链接分享
  • lml0703 「已注销」 2017-12-06 06:59

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

    点赞 评论 复制链接分享
  • weixin_42450288 weixin_42450288 2019-03-04 17:30

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

    点赞 评论 复制链接分享

相关推荐