Java Regex - Using String's replaceAll method to replace newlines
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."
Tim
Updated on July 09, 2022Comments
-
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 over 12 yearsEither works. See the answers to this question for a great explanation.
-
-
Tim over 12 yearsSo are you saying to use replace() inside a loop instead of using replaceAll() once? I dont understand why that's a better idea?
-
Bohemian over 12 years@Tim Calling
replace()
once replaces all occurrences (no "loop" required) -
Tim over 12 yearsOh wow. Thank you, for some reason I overlooked that when reading the spec.
-
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 about 9 years@Amalgovinus
replace()
replaces them all. The problem is thatreplaceAll()
is badly named: Both methods replace all occurrences - the only difference between them is thatreplaceAll()
uses regex for finding matches, while replace uses plain text. -
Rondo over 8 yearsThe 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 about 6 yearss.replaceAll("\r?\n", " --linebreak-- "); work for me
-
Matt almost 6 yearsI 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 over 4 yearsCan also be:
s.replaceAll(/^#.*\\r?\\n/, "")
. Example using regex delimiters to remove comments.