Java Regex - Using String's replaceAll method to replace newlines

77,759

Solution 1

Don't use regex!. You only need a plain-text match to replace "\n".

Use replace() to replace a literal string with another:

string = string.replace("\n", " --linebreak-- ");

Note that replace() still replaces all occurrences, as does replaceAll() - the difference is that replaceAll() uses regex to search.

Solution 2

Use below regex:

 s.replaceAll("\\r?\\n", " --linebreak-- ")

There's only really two newlines for UNIX and Windows OS.

Solution 3

Since Java 8 regex engine supports \R which represents any line separator (little more info: https://stackoverflow.com/a/31060125/1393766).

So if you have access to Java 8 you can use

string = string.replaceAll("\\R", " --linebreak-- ");

Solution 4

No need for 2 backslashes.

 String string = "hello \n world" ;
 String str = string.replaceAll("\n", " --linebreak-- ");
 System.out.println(str);

Output = hello --linebreak-- world

Solution 5

Just adding this for completeness, because the 2 backslash thing is real.

Refer to @dasblinkenlight answer in the following SO question (talking about \t but it applies for \n as well):

java, regular expression, need to escape backslash in regex

"There are two interpretations of escape sequences going on: first by the Java compiler, and then by the regexp engine. When Java compiler sees two slashes, it replaces them with a single slash. When there is t following a slash, Java replaces it with a tab; when there is a t following a double-slash, Java leaves it alone. However, because two slashes have been replaced by a single slash, regexp engine sees \t, and interprets it as a tab."

Share:
77,759
Tim
Author by

Tim

Updated on July 09, 2022

Comments

  • Tim
    Tim almost 2 years

    I have a string and would like to simply replace all of the newlines in it with the string " --linebreak-- ".

    Would it be enough to just write:

    string = string.replaceAll("\n", " --linebreak-- ");
    

    I'm confused with the regex part of it. Do I need two slashes for the newline? Is this good enough?

    • Kevin K
      Kevin K over 12 years
      Either works. See the answers to this question for a great explanation.
  • Tim
    Tim over 12 years
    So are you saying to use replace() inside a loop instead of using replaceAll() once? I dont understand why that's a better idea?
  • Bohemian
    Bohemian over 12 years
    @Tim Calling replace() once replaces all occurrences (no "loop" required)
  • Tim
    Tim over 12 years
    Oh wow. Thank you, for some reason I overlooked that when reading the spec.
  • Alkanshel
    Alkanshel about 9 years
    @Bohemian Not sure if that's totally true--in a string with a bunch of multiple-spaces ( " " ), doing replaceAll("\\s+"," ") will reduce all multi-space sections down to one, but simply replace(...) will only do it once.
  • Bohemian
    Bohemian about 9 years
    @Amalgovinus replace() replaces them all. The problem is that replaceAll() is badly named: Both methods replace all occurrences - the only difference between them is that replaceAll() uses regex for finding matches, while replace uses plain text.
  • Rondo
    Rondo over 8 years
    The other thing that is happening is that the first arg to replaceAll can be a flat string or a regex. In a String the "\n" is interpreted as a literal, but if you include other regex only symbols, like brackets for char sets, then you need the extra slash in order to get correct string to the regex compiler, as you say......eg, "[\\r\\n]+"
  • Mahdi Esmaeili
    Mahdi Esmaeili about 6 years
    s.replaceAll("\r?\n", " --linebreak-- "); work for me
  • Matt
    Matt almost 6 years
    I use string = string.replace("\\n", System.lineSeparator()); Edit: But that is when I'm passing 'new line characters' in from an external source (like from the command line).. so the above code replaces the literal '/n' with an actual 'new line', you might have been trying to do the reverse.
  • lepe
    lepe over 4 years
    Can also be: s.replaceAll(/^#.*\\r?\\n/, "") . Example using regex delimiters to remove comments.