作为问题的一些背景,我加载一个文本文件,然后从该文本文件中分配一个短语成为randomPirateWord,然后我将字母更改为该文本文件,成为**,并且正常工作。但是,当我要求用户猜一个字母时,它无法正常工作,如果他们猜错了那么代码工作正常,但如果他们正确猜出一个字母代码不能正常工作。我已将错误消息放在代码下面:
if (!escape.equalsIgnoreCase("m")){
System.out.print(" Type the letter you want to guess: ");
char letter = input.nextLine().charAt(0);
if(m.getRandomPirateWord().contains(letter+"")){
System.out.println(m.getRandomPirateWord().replaceAll("*",letter+""));
}
Error message:
Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*
^
at java.util.regex.Pattern.error(Pattern.java:1924)
at java.util.regex.Pattern.sequence(Pattern.java:2090)
at java.util.regex.Pattern.expr(Pattern.java:1964)
at java.util.regex.Pattern.compile(Pattern.java:1665)
at java.util.regex.Pattern.<init>(Pattern.java:1337)
at java.util.regex.Pattern.compile(Pattern.java:1022)
at java.lang.String.replaceAll(String.java:2162)
at uk.ac.aber.dcs.pirate_hangman.TextBasedGame.runTextBasedGame(TextBasedGame.java:45)
at uk.ac.aber.dcs.pirate_hangman.Application.runApplication(Application.java:19)
at uk.ac.aber.dcs.pirate_hangman.Main.main(Main.java:6)
答案 0 :(得分:5)
使用String#replace()
代替String#replaceAll()
。后者使用正则表达式进行替换,其中*
是元字符,需要进行转义。
答案 1 :(得分:1)
使用以下内容,您必须转义*
字符,因为replaceAll()方法接受regular expression作为一个参数
replaceAll("\\*",letter+"")
答案 2 :(得分:0)
请查看以下示例。
import java.io.*;
public class Test{
public static void main(String args[]){
String Str = new String("Welcome to Tutorialspoint.com");
System.out.print("Return Value :" );
System.out.println(Str.replaceAll("(.*)Tutorials(.*)",
"AMROOD" ));
}
}
方法语法:
public String replaceAll(String regex, String replacement)
regex - 要与此字符串匹配的正则表达式。
replacement - 将替换找到的表达式的字符串。
输出: AMROOD
答案 3 :(得分:-1)
问题是*是正则表达式中的保留字符,因此您需要将其转义。
replaceAll("\\*",letter+"")
答案 4 :(得分:-1)
'*'符号用于标识正则表达式中的一个组,它是'replaceAll'或'replaceFirst'方法的第一个参数
1. Using ‘replace’ method: This would be the good choice if you want to replace a string literal and not a pattern.
2. Escaping ‘*’ symbol: If you need to a use regular expression, and your pattern has no groups identified, then you can escape any group identification symbols from your replace string as shown below:
String replaceValue = java.util.regex.Matcher.quoteReplacement("*100");