为什么replaceAll("$","")不工作虽然replace("$","")工作得很好?

Rav*_*ore 1 java string replace replaceall

import java.util.*;
import java.lang.*;
import java.io.*;
class GFG
{
public static void main (String[] args)
 {
       int turns;
     Scanner scan=new Scanner(System.in);
     turns=scan.nextInt();
     while(turns-->0)
     {
       String pattern=scan.next();
       String text=scan.next();
       System.out.println(regex(pattern,text));

      }
 }//end of main method
 static int regex(String pattern,String text)
 {
     if(pattern.startsWith("^"))
       {
           if(text.startsWith(pattern.replace("^","")))
           return 1;
       }
       else if(pattern.endsWith("$"))
       {
           if(text.endsWith(pattern.replace("$","")))
           return 1;
       }
       else
       {
          if(text.contains(pattern))
          return 1; 
       }
       return 0;
 }
}
Run Code Online (Sandbox Code Playgroud)

输入:2或$ hodor或$ arya

输出:1 0

在这个程序中,我正在扫描两个参数(String),其中第一个是模式,第二个是我必须找到模式的文本.如果模式匹配,方法应该返回1,否则返回0.虽然使用替换它工作正常但是当我将replace()替换为replaceAll()时它没有按预期正常工作.如何使replaceAll()在此程序中工作.

T.J*_*der 6

因为replaceAll需要一个定义正则表达式的字符串,并且$在正则表达式中意味着"行尾".从链接:

public String replaceAll(String regex,
                         String replacement)
Run Code Online (Sandbox Code Playgroud)

将给定替换的给定正则表达式匹配的此字符串的每个子字符串替换.

你需要使用反斜杠(它也必须在字符串文字中转义)来逃避它:

if(text.endsWith(pattern.replaceAll("\\$","")))
Run Code Online (Sandbox Code Playgroud)

对于要逐字替换的复杂字符串,Pattern.quote非常有用:

if(text.endsWith(pattern.replaceAll(Pattern.quote("$"),"")))
Run Code Online (Sandbox Code Playgroud)

你不需要它,因为你的替换是"",但如果你的替换可能有特殊字符(如反斜杠或美元符号),也可以使用Matcher.quoteReplacement替换字符串.

  • @OldCurmudgeon和替换部分[Matcher,quoteReplacement()](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Matcher.html#quoteReplacement-java.lang.String-因为`$`和````也是特殊的(`$ x`来访问来自组'x`的匹配,'```所以我们可以逃避`$`). (2认同)