Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “命令”;stringa.replaceAll(“*”,stringb);引起错误_Java_String - Fatal编程技术网

Java “命令”;stringa.replaceAll(“*”,stringb);引起错误

Java “命令”;stringa.replaceAll(“*”,stringb);引起错误,java,string,Java,String,我试图用第二个字符串替换第一个字符串中的星号。例如,如果字符串a是“d*g”,字符串b是“in”,那么当我运行代码时,字符串a应该变成“ding”。但是,当我运行它时,会收到以下消息: java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0 * ^ at java.util.regex.Pattern.error(Unknown Source) at java.util.re

我试图用第二个字符串替换第一个字符串中的星号。例如,如果字符串a是“d*g”,字符串b是“in”,那么当我运行代码时,字符串a应该变成“ding”。但是,当我运行它时,会收到以下消息:

java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*
^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.replaceAll(Unknown Source)
    at Main.main(Main5.java:404)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)

有什么方法可以使此代码按预期运行吗?

您正在向
replaceAll
提供正则表达式
“*”
,并且
*
具有特殊意义

要提供文本
*
,必须使用反斜杠字符转义
*
,反斜杠字符本身需要在Java中转义

a = a.replaceAll("\\*", b);
该方法将正则表达式作为第一个参数。为了在正则表达式中使用
*
,必须对其进行转义。然而,看起来你真的很想

或者,退出
*
类似

String stringc = stringa.replaceAll("\\*", "in");
System.out.println(stringc);

两者的输出都是您请求的
ding

您要查找的是方法:


将第一个字符串的所有实例替换为第二个字符串。另一方面,该方法使用正则表达式,
“*”
本身不是正则表达式,因为星号字符是一个修饰符,表示“前一件事,重复零次或多次”.

或者您可以将
replaceAll
替换为
replace
,在不需要或不需要正则表达式时不使用它们。作为奖励,您的代码也会运行得更快(稍微快一点)。@DavidConrad,您确定
replace
replaceAll
快吗?嗯,它不会将字符串编译成正则表达式,这一定需要一些时间,否?在我查看的版本中,唯一的区别是一个将
LITERAL
标志传递给
Pattern.compile
,而另一个不传递。我不确定使用标志编译是否更快。这正是我所需要的。非常感谢。
String stringa = "d*g";
String stringb = stringa.replace("*", "in");
System.out.println(stringb);
String stringc = stringa.replaceAll("\\*", "in");
System.out.println(stringc);
stringa.replace("*", stringb);