我试图拆分一个字符串并将其添加到链表中。链表中的每个节点都是一个多项式边界。我试过这个,但它给了我一个悬空的元字符异常,我做错了什么?
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();
replace
接受字符串,但replaceAll
接受正则表达式,并且以+
开头的正则表达式无效。你有两个选择:
- 转义字符
+
,在Java中为\+
- 使用
Pattern#quote
重要提示:字符串是不可变的,您应该将结果分配给一个新的字符串。
堆栈跟踪非常不言自明:
线程"main"java.util.regex.PatternSyntaxException异常:挂起元索引0附近的字符"+"+-^
您需要转义以下行中的+
符号:
s = s.replaceAll("\+-", "-"); // Note: you need to assign the result back to 's'
不是答案(您已经得到了其中的2个),但非常重要的是要注意,String
是不可变的,因此操作方法(例如toLowerCase
、replace
等)将生成一个新字符串,并且不会修改调用它们的String
对象,因此将结果分配给您的字符串,以便更改生效,即:
s = s.toLowerCase();
首先字符串是不可变的,所以:
String s = "X^2+3x+5";
s.toLowerCase();
s.replaceAll(....)
s.substring(etc ...)
将为您提供与开头声明的字符串相同的字符串。replaceAll()方法将正则表达式作为第一个参数。"*"在正则表达式中具有特殊含义。你需要用\逃离它。
String result = s.toLowerCase().replaceAll("\*x", "x")
.replace("x^", "x").replaceAll("--", "+")
.replaceAll("\+-", "-").replaceAll("\+-", "-")
.replaceAll(" ", "");