Scanner input = new Scanner(System.in);
String girdi = input.nextLine();
for(int i=1; i<girdi.length(); i+=1){
if(girdi.charAt(i) == '*'){
int temp1= girdi.charAt(i-1)-'0';
int temp2= girdi.charAt(i+1)-'0';
int temp3 = temp1 * temp2;
String a = girdi.substring(i-1,i);
String b = "" + temp3;
String a2 = girdi.substring(i+1,i+2);
String b2 = girdi.substring(i , i+1);
girdi = girdi.replaceFirst(a,b);
girdi = girdi.replaceFirst(b2, "");
girdi = girdi.replaceFirst(a2, "");
}
}
我只是想做乘法
当我输入类似的东西时(3 * 5)给我错误:
线程中的异常&#34; main&#34; java.util.regex.PatternSyntaxException:悬空元字符&#39; *&#39;接近指数0
当我使用backslah逃跑时:
if(s.charAt(i) == '\\*'){
我看到未公开的字符文字和非法的表达错误开始
我该怎么办?
答案 0 :(得分:0)
请参阅String.replaceFirst
的Javadoc:
*
这样的字符具有特殊含义); \
和$
)。如果要从不受信任的来源(如用户输入)传入字符串,则需要适当引用它们:
girdi = girdi.replaceFirst(Pattern.quote(a), Matcher.quoteReplacement(b));
但是,String.replaceFirst
不适合这项工作。如果在您真正寻找的搜索字符串之前匹配搜索字符串,它将无法正常工作。
对您的代码进行最直接的修改就是使用String.substring
- 您确切知道要替换的内容的位置,因此请使用该信息:
girdi = girdi.substring(0, i-1) + temp3 + girdi.substring(i+2);
i
(这将取代循环中的最后7行)
您可以使用StringBuilder
再次更好地完成此操作,以避免在循环中创建不必要的字符串。
然而,在多位数或负数的情况下,这仍然不起作用。