高分求一个字符串拆分方法

lan125709702 2011-04-13 03:54:37
字符串是以下所例:
String s= "{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}}";
现在想用程序拆分为以X1=?;X=?;X=3为结果,拆分成三个字符串,
如:
1."{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}}"
2."{if(A&&B){if(B&&C){if(F&&G){X1=4;X2=5;X=6}}"
3."{if(A&&B){if(B&&C){if(H&&I){X1=40;X2=50;X=60}}"
...全文
325 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
安卓机器人 2011-04-14
  • 打赏
  • 举报
回复
大侠们都很牛B 啊
lan125709702 2011-04-14
  • 打赏
  • 举报
回复
21楼的方法大致可行,又提供了一种思路呀,谢谢了!
lan125709702 2011-04-14
  • 打赏
  • 举报
回复
20楼的明显不对,对于这个字符串,你就截不出来了
{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}else if(K&&L){X1=400;X=500;X3=600}}}
lxbccsu 2011-04-14
  • 打赏
  • 举报
回复
正则表达式不会拆分,用栈吧:

public static void main(String[] args) {
String str = "{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}else if(K&&L){X1=400;X=500;X3=600}}}";
str = str.replaceAll("else", "");

List<String> strList = new ArrayList<String>();
Stack<Character> stack = new Stack<Character>();
char[] charArray = str.toCharArray();

for(int i = 0; i < charArray.length; i++){
if(charArray[i] == ' ') continue;
stack.push(charArray[i]);
if(charArray[i] == '}'){
splitString(strList, stack);
}
}

for(String obj : strList){
System.out.println(obj);
}
}

private static void splitString(List<String> strList, Stack<Character> stack) {
if(stack == null || stack.isEmpty()) return ;
int count = sumLeftKuoHao(stack);
char c = stack.pop();
c = stack.peek();
if(c == '{'){
int endIndex = 0;
while(!stack.isEmpty()){
c = stack.pop();
if(c == '{') endIndex++;
if(endIndex == 2){
stack.push(c);
break;
}
}
}else{
StringBuilder sb = new StringBuilder();
for(int i = 0 ; i < count; i++){
sb.append("}");
}

int endIndex = 0;
while(true){
c = stack.pop();
if(c == '{') endIndex++;
if(endIndex == 2){
stack.push(c);
break;
}else{
sb.append(c);
}
}
String suffix = sb.reverse().toString();
sb.delete(0, suffix.length());

Character[] cArr = new Character[stack.size()];
cArr = stack.toArray(cArr);
for(char ch : cArr){
sb.append(ch);
}

strList.add(sb.toString() + suffix);
}
}

private static int sumLeftKuoHao(Stack<Character> stack) {
if(stack == null || stack.isEmpty()) return 0;
int sum = 0;
Character[] cArr = new Character[stack.size()];
cArr = stack.toArray(cArr);
for(char c : cArr){
if(c == '{') sum++;
}
return sum;
}
hyl7733 2011-04-14
  • 打赏
  • 举报
回复
import java.io.*;
import java.util.Arrays;
public class Test {
public static void main(String[] args) throws IOException {
String s= "{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}" +
"else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}}";
String[] str = s.split("else");
System.out.println(Arrays.toString(str));

}
}
fangyusu20 2011-04-14
  • 打赏
  • 举报
回复
很明显是 字符串分割啊 split 按 else 分割

如果你还要检验 字符串的正确性 就麻烦了 正则表达式 乱套的很 不过要是写也能写出来 分割下 用正则验证下结果 防止异常
Coolfatman 2011-04-14
  • 打赏
  • 举报
回复
看来楼主想做一个自动UT的工具。
lan125709702 2011-04-13
  • 打赏
  • 举报
回复
14楼和16楼的方法都没有实现。当解析
{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}else if(K&&L){X1=400;X=500;X3=600}}}

这个字符串的时候,结果都是不正确的,正确的应该是:
{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}
if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}
if(A&&B){if(B&&C){if(F&&G){X1=4;X=5;X3=6}
if(A&&B){if(B&&C){if(H&&I){X1=40;X=50;X3=60}}
if(A&&B){if(K&&L){X1=400;X=500;X3=600}


在最后一个都有错误 ,不过有了上面的例子,明天上班的时候想想就应该能出来了!
谢潇雨 2011-04-13
  • 打赏
  • 举报
回复
如果你是考虑内括号中的内容是不定的可以先将其中的内容整体匹配出来在利用else 分割
import java.util.regex.*;

public class Split {

public static void main(String args[])
{
String regex1="\\{(.+)\\{(.+)\\{(.+)\\{(.+)\\}else (.+)\\{(.+)\\}else (.+)\\{(.+)\\}\\}\\}\\}";
String str="{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}}}";
String last=null;
Matcher m=Pattern.compile("\\{(if\\(\\w\\&\\&\\w\\))\\{(if\\(\\w\\&\\&\\w\\))\\{(.+)\\}\\}\\}").matcher(str);
while(m.find())
{
for(int j=0;j<=m.groupCount();j++)
System.out.println(m.group(j)+" ");

last=m.group(m.groupCount());
}
String s[]=last.split("else ");
for(int j=0;j<s.length;j++)
System.out.println(s[j]);

}
}

谢潇雨 2011-04-13
  • 打赏
  • 举报
回复

import java.util.regex.*;

public class Split {

public static void main(String args[])
{
String str="{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}}}";
Matcher m=Pattern.compile("\\{(.+)\\{(.+)\\{(.+)\\{(.+)\\}else (.+)\\{(.+)\\}else (.+)\\{(.+)\\}\\}\\}\\}").matcher(str);
while(m.find())
{
for(int j=1;j<=m.groupCount();j++)
System.out.println(m.group(j)+" ");

}

}
}

用正则分离开这样可以吗
24K純帥 2011-04-13
  • 打赏
  • 举报
回复
不就是把else if用换行符替换下么
caofaping 2011-04-13
  • 打赏
  • 举报
回复

/**
* 基本思路: else分割,替换最后一个if里面的表达式, 分割多少长度,就有多少种组合
*/
public static void get3() {
// 是否匹配
int len = -1;
// 替换正则,当字符串的规则变化时,正则也要做相应的修改
String reg = "if\\(\\w\\&\\&\\w\\)\\{(\\w\\d?\\=\\d\\d*;?){3}\\}";
String s = "if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else" +
" if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}else" +
" if(K&&L){X1=400;X=500;X3=600}}";
String s1 = "{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}}";
String[] arr = s1.split("else");

if (arr.length == 0) {
System.out.println("no");
return;
}
if (arr.length == 1) {
System.out.println(arr[0]);
return;
}

for (int i = 0; i < arr.length; i++) {
if (i == 0 && len < 1) {
System.out.println(arr[0].trim());
Matcher m = Pattern.compile(reg).matcher(arr[0].trim());
if (m.find()) {
len = arr[0].indexOf(m.group());
}
} else {
if (len > 1) {
//除掉最后一个}
if(i == arr.length - 1){
System.out.println(arr[0].substring(0, len) + arr[i].trim().substring(0, arr[i].trim().length() - 1));
continue;
}
System.out.println(arr[0].substring(0, len) + arr[i].trim());
} else {
System.out.println("字符串规则不对,重写正则!");
}
}
}
}


miaomiaohaishui 2011-04-13
  • 打赏
  • 举报
回复
没明白什么意思
放纵青春 2011-04-13
  • 打赏
  • 举报
回复
想问一下:LZ将这个字符串拆成那个样子,目的是做什么呢?就是说在什么地方遇到的这个问题!
lan125709702 2011-04-13
  • 打赏
  • 举报
回复
大家都下班了、?
lan125709702 2011-04-13
  • 打赏
  • 举报
回复
恩,可能还是要按正则表达式进行处理了,我列的还是比较简单的例子呢
血战31天 2011-04-13
  • 打赏
  • 举报
回复
还有一种方法
(((()()()()())))
1234343434343210
数字表示正括号出现的次数,出现一次加一次,出现反括号时减一次
数字最大的就是最里的括号,这样并列关系就清晰了
前提是正反括号一定得对应
njustgirl 2011-04-13
  • 打赏
  • 举报
回复
以为就只要处理你给的那种形式呢。。。
那可以从让左右大括号配对入手嘛
lan125709702 2011-04-13
  • 打赏
  • 举报
回复
njustgirl说的方法不行,不能写的这么死。以下为例:
{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}else if(K&&L){X1=400;X=500;X3=600}}

像你说的方法,拆分就会成为:
{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}
{if(A&&B){if(B&&C){if(F&&G){X1=4;X=5;X3=6}
{if(A&&B){if(B&&C){if(H&&I){X1=40;X=50;X3=60}}
{if(A&&B){if(B&&C){if(K&&L){X1=400;X=500;X3=600}}


像最后一个拆分就是错误的。应该拆分成
{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}
{if(A&&B){if(B&&C){if(F&&G){X1=4;X=5;X3=6}
{if(A&&B){if(B&&C){if(H&&I){X1=40;X=50;X3=60}}
{if(A&&B)if(K&&L){X1=400;X=500;X3=600}}
njustgirl 2011-04-13
  • 打赏
  • 举报
回复
String str = "{if(A&&B){if(B&&C){if(D&&E){X1=1;X2=2;X=3}else if(F&&G){X1=4;X=5;X3=6}else if(H&&I){X1=40;X=50;X3=60}}}";
String str1 = str.substring(0, str.indexOf("else if"));
String str2 = str.substring(str.indexOf("else if"));
String head = str1.substring(0, str1.lastIndexOf("if"));

System.out.println(str1); //第一个字符串
String[] tails = str2.split("else ");
for(int i=1;i<tails.length;i++){
System.out.println(head+tails[i]); //依次输出下面的字符串
}
大括号不平衡自己再稍微处理下
加载更多回复(5)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧