regex.PatternSyntaxException元字符' *'

时间:2016-11-18 21:55:30

标签: java

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) == '\\*'){ 

我看到未公开的字符文字和非法的表达错误开始

我该怎么办?

1 个答案:

答案 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再次更好地完成此操作,以避免在循环中创建不必要的字符串。

然而,在多位数或负数的情况下,这仍然不起作用。