如何拆分字符串两次并将其添加到链表?

时间:2015-03-30 07:24:48

标签: java regex string

我尝试拆分字符串并将其添加到链接列表中。链表中的每个节点都是多项式边界。我尝试了这个,但它给了我一个悬空元字符异常,我做错了什么?

 String s = "X^2+3x+5";
 LinkedList p_list = new LinkedList();

 s.toLowerCase();
 s.replace("*x", "x");
 s.replace("x^", "x");
 s.replaceAll("--","+");
 s.replaceAll("+-", "-");
 s.replaceAll(" ", "");
 String []  st = s.split("(?=[+-])");
 String [] st2 = new String[2];

 for(int i=0;i<=st.length;i++){
    if(st[i].contains("x")){
        st2=st[i].split("x");
        if(st2[0].length()== 0 && st2[1].length()== 0){
            p_list.addFirst(1,1);
        }else if(st2[0].length()== 1 && st2[1].length()== 0){
                p_list.addFirst(Integer.parseInt(st2[0]),0);
        }
    } else {
        p_list.addFirst(Integer.parseInt(st2[0]),Integer.parseInt(st2[1]));
    }


 }  


 p_list.printList();

4 个答案:

答案 0 :(得分:4)

堆栈跟踪非常明显:

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta 
character '+' near index 0
+-
^

您需要转义以下行中的+符号:

s = s.replaceAll("\\+-", "-"); // Note: you need to assign the result back to 's'

答案 1 :(得分:4)

replace接受字符串,但replaceAll接受正则表达式,以+开头的正则表达式无效。您有两种选择:

重要提示:字符串是不可变的,您应该将结果分配给新的字符串。

答案 2 :(得分:2)

首先,String是不可变的,所以:

String s = "X^2+3x+5";

s.toLowerCase();
s.replaceAll(....)
s.substring(etc ...)

将为您提供与开头声明的相同的字符串。 replaceAll()方法将正则表达式作为第一个参数。并且&#34; *&#34;在正则表达式中有特殊意义。你需要用\来逃避它。

String result = s.toLowerCase().replaceAll("\\*x", "x")
                .replace("x^", "x").replaceAll("--", "+")
                .replaceAll("\\+-", "-").replaceAll("\\+-", "-")
                .replaceAll(" ", "");

答案 3 :(得分:2)

不是答案(你已经有2个),但非常重要的是要注意String是不可变的,因此操作方法(例如toLowerCasereplace等)将产生一个新字符串,不会修改调用它们的String对象,因此将结果分配给字符串,以使更改生效,即:

s = s.toLowerCase();