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
楼主,单个for循环内容好提取,嵌套for循环在循环深度未知的情况下会比较麻烦的,首先包住循环体的花括号对应就比较麻烦(因为嵌套循环,花括号内还有许多未知的花括号)。
如果知道循环深度的话,可以很快提取到你想要的文本内容。否则通过一个正则一步到位我觉得比较难。我能想到的解决办法是,先匹配单层的for循环,获取到循环体内容后,
将整个文本中单层for循环replace为空。用新文本再去匹配单层for循环,递归实现。方法比较笨并且不能直接捕获到嵌套for内的内容,楼主自己忖度。
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;
}
}
你可以点击所要提取内容的最外层的花括号来提取内容
这题目什么意思?
是把C代码作为文本输入?把所有括号去掉还是指定提取第几个括号?
你可以吧{和}替换成“”或者递归截取从{到};
谢谢,我原来想如果用 栈什么的 进行括号匹配,感觉过于笨重。所以上来问问能不能用正则或者其他简单的方法。
这是第一次提问,提问后被几个水贴的人搞的有点恼火,这几天就没有看CSDN。
问题已经解决了。谢谢各位。
如何用正则处理未知括号层数,提取最外层大括号