string.replaceAll("\\n","") 如果将字符串作为来自控制台的输入并包含换行符,则不起作用

string.replaceAll("\\n","") not working if string is taken as input from console and contains newline character

案例 1:从扫描器获取字符串输入并将 \n 替换为 --(无效)

Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
str = str.replaceAll("\n", "--");
System.out.println(str);

输入:“UY9Q3HGjqYE1aHNIG+Rju2hS3WAAEFlakOSGZWffabFpWkeQ\nz4g6mfKoGVR2\nF1QkiHRMZfL4mCvChAuL7gCT3d3SrmxD6lBnOiWiFTPUz4Q=\n”

案例2:如果我直接分配与上面相同的值的字符串,同样的事情会发生。

String str = "UY9Q3HGjqYE1aHNIG+Rju2hS3WAAEFlakOSGZWffabFpWkeQ\nz4g6mfKoGVR2\nF1QkiHRMZfL4mCvChAuL7gCT3d3SrmxD6lBnOiWiFTPUz4Q=\n";
       
str = str.replaceAll("\n", "--");

PS: 我已经尝试过使用\n, line.separater

    String str = "Input\nwith backslash and n";
    str = str.replaceAll("\\n", "--");
    System.out.println(str);

输出:

Input--with backslash and n

我们需要将反斜杠转义两次:为了告诉正则表达式我们需要放置两个反斜杠。并告诉 Java 编译器我们打算在字符串中使用文字反斜杠,这两个反斜杠中的每一个都需要作为两个反斜杠输入。所以我们最终输入了其中的四个。

nextLine() 读取一行,因此该行不能包含换行符。所以我假设您输入的是反斜杠和 n 作为输入的一部分。

较少混淆的解决方案

我们不需要在这里使用任何正则表达式,这样做会使转义业务复杂化。所以不要。

    String str = "Input\nwith backslash\nand n\n";
    str = str.replace("\n", "--");
    System.out.println(str);

Input--with backslash--and n--

replace 方法替换所有出现的给定文字字符串(尽管方法名称中没有 All)。所以现在我们只需要一种转义,一种用于 Java 编译器。

在正则表达式中,如果您使用单个反斜杠“\”会抛出错误,因为它是转义字符。如果你使用双反斜杠“\”,它会抛出“java.util.regex.PatternSyntaxException: Unexpected internal error near index”异常。

双反斜杠在正则表达式中被视为单反斜杠“\”。因此应添加四个反斜杠“\\”以匹配字符串中的单个反斜杠。

请尝试将 \n 替换为 \\n:

Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
str = str.replaceAll("\\n", "--");
System.out.println(str);