繁体   English   中英

.replaceAll()方法无法正常工作

[英].replaceAll() method not working correctly

作为问题的背景知识,我加载了一个文本文件,然后从该文本文件中分配了一个短语以成为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)

使用String#replace()而不是String#replaceAll() 后者使用正则表达式模式进行替换,其中*是元字符,需要转义。

使用以下内容,您必须转义*字符,因为replaceAll()方法接受正则表达式作为一个参数

replaceAll("\\*",letter+"")

查看以下示例。

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-此字符串要匹配的正则表达式。

  • replace-将替换找到的表达式的字符串。

输出: AMROOD

参考:正则表达式替换

问题是*是正则表达式中的保留字符,因此您需要对其进行转义。

replaceAll("\\*",letter+"")

“ *”符号用于从正则表达式中识别组,该正则表达式是“ 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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM