2

Unfortunately, I'm having some difficulty replacing new lines.

public class Example {

    static String s = "73167176531330624919225119674426574742355349194934\n" +
        "96983520312774506326239578318016984801869478851843\n" +
        "85861560789112949495459501737958331952853208805511\n" +
        "12540698747158523863050715693290963295227443043557\n" +
        "66896648950445244523161731856403098711121722383113\n" +
        "62229893423380308135336276614282806444486645238749\n" +
        "30358907296290491560440772390713810515859307960866\n" +
        "70172427121883998797908792274921901699720888093776\n" +
        "65727333001053367881220235421809751254540594752243\n" +
        "52584907711670556013604839586446706324415722155397\n" +
        "53697817977846174064955149290862569321978468622482\n" +
        "83972241375657056057490261407972968652414535100474\n" +
        "82166370484403199890008895243450658541227588666881\n" +
        "16427171479924442928230863465674813919123162824586\n" +
        "17866458359124566529476545682848912883142607690042\n" +
        "24219022671055626321111109370544217506941658960408\n" +
        "07198403850962455444362981230987879927244284909188\n" +
        "84580156166097919133875499200524063689912560717606\n" +
        "05886116467109405077541002256983155200055935729725\n" +
        "71636269561882670428252483600823257530420752963450".replaceAll("\\n", "");

    public static void main(String[] args) {
        System.out.println(s);
    }
}    

I would like to remove all occurrences of \n from String s. I tried looking up the answer on StackOverflow, but every post seems to have a different answer (and they are all complicated and hard to remember).

Is there a simple way of doing this?


I have also tried

replaceAll("\n", "")
replaceAll("\\\\n", "")
replaceAll(System.getProperty("line.separator"), "")
replaceAll("(\\r|\\n)", "")
Pshemo
  • 122,468
  • 25
  • 185
  • 269
ktm5124
  • 11,861
  • 21
  • 74
  • 119

3 Answers3

8
"hello" + "world".replace("o","")

is same as

"hello" + ("world".replaceAll("o",""))

So replaceAll will affect only last part of your string, which in your case is

"71636269561882670428252483600823257530420752963450".replaceAll("\\n", ""). 

To solve this problem use parenthesis to first concatenate all string parts, and then call replace on resulting string.

static String s = (
        "73167176531330624919225119674426574742355349194934\n" +
        "96983520312774506326239578318016984801869478851843\n" +
        "85861560789112949495459501737958331952853208805511\n" +
        "12540698747158523863050715693290963295227443043557\n" +
        "66896648950445244523161731856403098711121722383113\n" +
        "62229893423380308135336276614282806444486645238749\n" +
        "30358907296290491560440772390713810515859307960866\n" +
        "70172427121883998797908792274921901699720888093776\n" +
        "65727333001053367881220235421809751254540594752243\n" +
        "52584907711670556013604839586446706324415722155397\n" +
        "53697817977846174064955149290862569321978468622482\n" +
        "83972241375657056057490261407972968652414535100474\n" +
        "82166370484403199890008895243450658541227588666881\n" +
        "16427171479924442928230863465674813919123162824586\n" +
        "17866458359124566529476545682848912883142607690042\n" +
        "24219022671055626321111109370544217506941658960408\n" +
        "07198403850962455444362981230987879927244284909188\n" +
        "84580156166097919133875499200524063689912560717606\n" +
        "05886116467109405077541002256983155200055935729725\n" +
        "71636269561882670428252483600823257530420752963450"
    ).replaceAll("\\n", "");

But in situation where we are not dealing with initializing field, I would prefer splitting this "one-liner" into more steps which will be more readable and you will avoid errors like one from your question:

//concatenation
String s =  "....."
           +"....."
           :
           +".....";

//modification
s = s.replaceAll("\\n","");
Pshemo
  • 122,468
  • 25
  • 185
  • 269
  • 1
    @yoseph1998 It will. Regex engine in Java allows us to write `\n` as `"\\n"`. To create ``\`` literal in regex engine we would need to write it as `"\\\\"` string. `"\\"` is regex metacharacter and can be used to produce `\n` which will represent line break. – Pshemo Mar 22 '15 at 20:58
  • my bad, i'll delete the comment – yoseph1998 Mar 22 '15 at 20:59
  • Nice catch. Even better would be to use `replace` though, since you are not using a regex. – Keppil Mar 22 '15 at 21:38
  • 1
    @Keppil `replace` also uses regex engine, but it just adds escaping mechanisms for us. It would be different story if we would use `replace(char, char)` which really doesn't use regex because it is simple iteration. – Pshemo Mar 22 '15 at 21:39
  • 1
    Ah, indeed it does. Then I have no objections. :) – Keppil Mar 22 '15 at 21:44
4

First of all, when you are doing

static String s = "73167176531330624919225119674426574742355349194934\n" +
        "96983520312774506326239578318016984801869478851843\n" +
        "85861560789112949495459501737958331952853208805511\n" +
        "12540698747158523863050715693290963295227443043557\n" +
        "66896648950445244523161731856403098711121722383113\n" +
        "62229893423380308135336276614282806444486645238749\n" +
        "30358907296290491560440772390713810515859307960866\n" +
        "70172427121883998797908792274921901699720888093776\n" +
        "65727333001053367881220235421809751254540594752243\n" +
        "52584907711670556013604839586446706324415722155397\n" +
        "53697817977846174064955149290862569321978468622482\n" +
        "83972241375657056057490261407972968652414535100474\n" +
        "82166370484403199890008895243450658541227588666881\n" +
        "16427171479924442928230863465674813919123162824586\n" +
        "17866458359124566529476545682848912883142607690042\n" +
        "24219022671055626321111109370544217506941658960408\n" +
        "07198403850962455444362981230987879927244284909188\n" +
        "84580156166097919133875499200524063689912560717606\n" +
        "05886116467109405077541002256983155200055935729725\n" +
        "71636269561882670428252483600823257530420752963450".replaceAll("\\n", "");

you are only replacing the last concatenation of that string (Note: which has no "\n").

what you need to do is get rid of that replaceAll in your string declaration, and in your main method do s = s.replaceAll("\n", ""); like the following:

public static void main(String[] args) {
    s = s.replaceAll("\n", "");
    System.out.println(s);
}

Tested and works :D Hope this was helpful :D

yoseph1998
  • 355
  • 2
  • 12
0

You could split and join the string before printing it like this:

public static void main(String[] args) {
    System.out.println(String.join("", s.split("\n")));
}