141

I'd like to replace all instances of a substring in a string but String.replaceAll() only accepts a pattern. The string that I have came from a previous match. Is it possible to add escapes to the pattern that I have or is there a version of replaceAll() in another class which accepts a literal string instead of a pattern?

user2428118
  • 7,935
  • 4
  • 45
  • 72
dromodel
  • 9,581
  • 12
  • 47
  • 65
  • possible duplicate of [Backslash problem with String.replaceAll](http://stackoverflow.com/questions/1701839/backslash-problem-with-string-replaceall) – McDowell May 26 '11 at 08:40

2 Answers2

230

Just use String.replace(CharSequence,CharSequence) rather than replaceAll.

NB: replace doesn't just replace the first occurrence, it replaces all occurrences, like replaceAll.

Sandra Rossi
  • 11,934
  • 5
  • 22
  • 48
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • 25
    This doesn't just replace the first? Weird they called it "replaceAll" instead of "replaceRegex". – Magic Octopus Urn Mar 28 '18 at 20:13
  • 9
    ```System.out.println("hello world, hello life, hello you".replace("hello","hi"));``` returns ```"hi world, hi life, hi you"```. – Thiago Mata Aug 27 '18 at 02:29
  • 23
    @MagicOctopusUrn: Yes, I agree it was very poor naming - it's caused a lot of confusion over time. – Jon Skeet Aug 27 '18 at 07:15
  • very bad naming of the methods. Why do they(sun/oracle) make simple things complicated – Stunner Jun 16 '20 at 02:49
  • 3
    I believe the naming of `replaceAll` (regex method) was to differentiate from `replaceFirst` (regex method), not so much to differentiate from `replace` (non regex method). – JohnRDOrazio Oct 30 '20 at 14:00
  • When I try that, why is Android Studio bleating "'replace()' could be replaced with compiled 'java.util.regex.Pattern' construct", as if replace() used a regular expression, when the internal documentation for replace() says "literal target sequence"? – Phlip Feb 19 '21 at 14:50
  • @Phlip: It may well be that a compiled pattern would be more efficient than using `replace()`. I don't know the details, but that seems entirely plausible. (I would also suggest trying to use dismissive language like "bleating" to describe behavior.) – Jon Skeet Feb 19 '21 at 14:57
106

The method to add escapes is Pattern.quote().

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

But as Jon says you can just use replace(). Despite the fact that it deviates from the replaceAll name, it does replace all occurrences just like replaceAll().

Mark Peters
  • 80,126
  • 17
  • 159
  • 190
  • 1
    Works perfectly if you havea "$" in your matchingStr for example. – Julien Lafont Jul 16 '15 at 09:29
  • rather Pattern.compile(); Pattern.quote() brings undesirable results – Pavlo Zvarych Jun 14 '16 at 11:58
  • 1
    @PavloZvarych: `Pattern.compile()` compiles the string as a regular expression, meaning the special characters will be given the special meaning. That's the complete opposite of what `Pattern.quote()` does, and what the OP was asking for (`quote()` says, "treat the string as a literal"). Maybe you could expand on what "undesirable results" you're talking about. – Mark Peters Jun 14 '16 at 13:41
  • @MarkPeters it was something like \\G1\\G for "$1" – Pavlo Zvarych Jun 14 '16 at 14:15
  • @PavloZvarych: I get `\Q$1\E`, which is exactly what I'd expect. – Mark Peters Jun 14 '16 at 14:40
  • @MarkPeters, to be honest I was passing "$aa +" to Pattern.quote() method and was expected that I will get the same String as a result after replaceAll() method call. I just needed the same result at the output. Pattern.compile() as it seems helped. I even don't know what to do with such a "\Q$1\E" String. – Pavlo Zvarych Jun 14 '16 at 18:21
  • 1
    @PavloZvarych: If you're trying to quote the replacement (and not the search pattern), you want to use `Matcher.quoteReplacement("$aa +")`. `Pattern.compile()` produces a `Pattern`, not a `String`, so it's unclear to me how you are even using it in `replaceAll`. – Mark Peters Jun 14 '16 at 18:43
  • Let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/114668/discussion-between-pavlo-zvarych-and-mark-peters). – Pavlo Zvarych Jun 14 '16 at 19:05