为什么replaceAll(" $","")无效,尽管替换(" $","")工作得很好?

时间:2016-08-19 07:47:10

标签: java string replace replaceall

df$tmpx <- cut2(df$X1, g=3)
levels(df$tmpx) <- c(1,2,3)
df$tmpy <- cut2(df$Y1, g=3)
levels(df$tmpy) <- c(1,2,3)

enum <- 1
for (x in sort(unique(df$tmpx)))
{
  for (y in sort(unique(df$tmpy)))
  {
    print(enum)
    df$cat11[df$tmpx == x & df$tmpy == y] <- enum
    enum <- enum + 1
  }
}

输入: 2 或$ hodor 或$ 艾莉亚

输出: 1 0

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

4 个答案:

答案 0 :(得分:6)

因为replaceAll要求字符串定义正则表达式,而$表示&#34;行结束&#34;在正则表达式中。从链接:

public String replaceAll(String regex,
                         String replacement)
     

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

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

if(text.endsWith(pattern.replaceAll("\\$","")))

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

if(text.endsWith(pattern.replaceAll(Pattern.quote("$"),"")))

你不需要它,因为你的替代品是"",但如果你的替换品中可能包含特殊字符(如反斜杠或美元符号),请在替换字符串上使用Matcher.quoteReplacement同样。

答案 1 :(得分:3)

$是正则表达式(EOL)中的特殊字符。你必须逃避它

pattern.replaceAll("\\$","")

答案 2 :(得分:1)

尽管名称相似,但这两种方法却截然不同。

replace用其他子串(*)替换子串。

replaceAll使用正则表达式匹配,$是一个特殊的控制字符(意思是“字符串/行的结尾”)。

你不应该在这里使用replaceAll,但如果必须,你必须quote the $

 pattern.replaceAll(Pattern.quote("$"),"")

(*)使事情更加混乱,replace也取代了所有出现,因此方法名称的唯一区别并不是都描述了函数的差异。

答案 3 :(得分:0)

通过将 $ 替换为 \$ 来引入另一个级别的复杂性。

"$ABC$AB".replaceAll(Matcher.quoteReplacement("$"), Matcher.quoteReplacement("\\\\$"))
// Output - \\$ABC\\$AB

这对我有用。

对于此处报告的问题,

"$ABC$AB".replaceAll(Matcher.quoteReplacement("$"), "")

应该可以。