我尝试拆分字符串并将其添加到链接列表中。链表中的每个节点都是多项式边界。我尝试了这个,但它给了我一个悬空元字符异常,我做错了什么?
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();
答案 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
接受正则表达式,以+
开头的正则表达式无效。您有两种选择:
+
\\+
Pattern#quote
重要提示:字符串是不可变的,您应该将结果分配给新的字符串。
答案 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
是不可变的,因此操作方法(例如toLowerCase
,replace
等)将产生一个新字符串,不会修改调用它们的String
对象,因此将结果分配给字符串,以使更改生效,即:
s = s.toLowerCase();