首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >regex.PatternSyntaxException元字符“*”

regex.PatternSyntaxException元字符“*”
EN

Stack Overflow用户
提问于 2016-11-18 21:55:30
回答 1查看 2.5K关注 0票数 0
代码语言:javascript
复制
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)的内容时,请给我一个错误:

线程"main“java.util.regex.PatternSyntaxException中的异常:在索引0附近悬挂元字符'*‘

当我用回扣逃跑时:

代码语言:javascript
复制
if(s.charAt(i) == '\\*'){ 

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

我该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-18 22:29:16

参考String.replaceFirst的Javadoc

  • 第一个参数是正则表达式(像*这样的字符具有特殊的意义);
  • 第二个参数是正则替换(意味着某些字符序列具有特殊意义,例如\$)。

如果要从不受信任的源传入字符串(如用户输入),则需要适当地引用它们:

代码语言:javascript
复制
girdi = girdi.replaceFirst(Pattern.quote(a), Matcher.quoteReplacement(b));

然而,String.replaceFirst并不是这个工作的合适工具。如果在您真正要寻找的字符串之前有匹配的搜索字符串,则它将无法正常工作。

对代码的最直接的修改是使用String.substring --您确切地知道要替换的东西在哪里,所以请使用这些信息:

代码语言:javascript
复制
girdi = girdi.substring(0, i-1) + temp3 + girdi.substring(i+2);
i 

(这将取代循环中的最后7行)

您可以通过使用StringBuilder再次更好地做到这一点,以避免在循环中创建不必要的字符串。

然而,在数位数或负数的情况下,这种情况仍然行不通。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40686543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档