Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么删除断线后重新插入断线不起作用?_Java_Regex_String_Replace - Fatal编程技术网

Java 为什么删除断线后重新插入断线不起作用?

Java 为什么删除断线后重新插入断线不起作用?,java,regex,string,replace,Java,Regex,String,Replace,我正在编写一段代码,该代码应该从文本块中删除实际的换行符,并将其替换为字符串“\n”。然后,当在另一时间读取字符串时,它应该替换换行符(换句话说,搜索所有“\n”并插入\n。然而,虽然第一次转换工作正常,但它不执行后者。第二次替换似乎什么也不做。为什么 替换: theString.replaceAll(Constants.LINE_BREAK, Constants.LINE_BREAK_DB_REPLACEMENT); 重新替换: theString.replaceAll(Constants.

我正在编写一段代码,该代码应该从文本块中删除实际的换行符,并将其替换为字符串“\n”。然后,当在另一时间读取字符串时,它应该替换换行符(换句话说,搜索所有“\n”并插入
\n
。然而,虽然第一次转换工作正常,但它不执行后者。第二次替换似乎什么也不做。为什么

替换:

theString.replaceAll(Constants.LINE_BREAK, Constants.LINE_BREAK_DB_REPLACEMENT);
重新替换:

theString.replaceAll(Constants.LINE_BREAK_DB_REPLACEMENT, Constants.LINE_BREAK);
常数:

public static final String LINE_BREAK = "\n";
public static final String LINE_BREAK_DB_REPLACEMENT = "\\\\n";

在最后一次replaceAll()方法调用中不需要四个反斜杠。 这似乎对我很管用

    String str = "abc\nefg\nhijklm";

    String newStr = str.replaceAll("\n", "\\\\n");

    String newnewStr = newStr.replaceAll("\\\\n", "\n");
输出为:

abc
efg
hijklm
abc\nefg\nhijklm
abc
efg
hijklm

我想这正是您所期望的。

在中,正则表达式字符串和替换字符串都将反斜杠视为转义字符:

  • regex
    表示一个,它将反斜杠转义为
    \\
  • replacement
    是一个替换字符串,它还转义反斜杠:
请注意,替换字符串中的反斜杠(\)和美元符号($)可能会导致结果与将其视为文字替换字符串时的结果不同;请参阅Matcher.replaceAll

这意味着反斜杠必须在两个参数中都转义。此外,字符串常量也使用反斜杠作为转义字符,因此传递给该方法的字符串常量中的反斜杠必须进行双转义(另请参阅)

这对我来说很好:

// Replace newline with "\n"
theString.replaceAll("\\n", "\\\\n");

// Replace "\n" with newline
theString.replaceAll("\\\\n","\n");
您还可以使用
Matcher.quoteReplacement()
方法将替换字符串视为文字:

// Replace newline with "\n"
theString.replaceAll("\\n", Matcher.quoteReplacement("\\n"));
// Replace "\n" with newline
theString.replaceAll("\\\\n",Matcher.quoteReplacement("\n"));

实际上,您正在使用\\n替换换行符,但如果使用相同的常量替换回原始换行符,则不会产生任何影响。值得注意的是,即使修复了当前问题,转换也是有损的:如果原始字符串包含反斜杠字符,后跟字母
n
,则将其置于thr虽然这两个转换会将其转换为换行符。