1

我有来自不同提要的数据流,我需要清理这些数据流。

数据采用特定格式,如果某些句子跨越多行,则使用“\”(反斜杠)分隔,我想删除它。\ 也出现在文本的其他部分,用于转义引号等,我不想删除这些反斜杠。所以最终我想删除“\\n”。

我尝试按照正则表达式删除 \ 和 \n 但它不起作用:

singleLine.replaceAll("(\\\\n|\\\\r)", "");

我不确定在这种情况下什么正则表达式会起作用。

4

4 回答 4

5

正则表达式对此并不真正必要。如果我是你,我会用...

singleLine=singleLine.replace("\\\\n", "");

很多人认为replace方法只替换一个,但实际上唯一的区别是replaceAll使用的是正则表达式,而replace只是替换String的完全匹配。

但是,如果您确实想使用正则表达式,我相信您必须这样做 \\\\\\\\ (您必须在Java和正则表达式中“取消”转义字符,所以x4,而不仅仅是x2)

再解释一下

唯一的另一个问题是在您的示例中,您从未将 singLine 设置为等于任何值;我不确定你是隐藏了还是错过了。

编辑:进一步解释 \\\\\\\\ 的原因,Java 要求您使用 "\\" 来表示一个 \。正则表达式还可以使用 \ 字符,并要求您再次为它做同样的事情。如果您只是在 Java 中使用“\\”,则正则表达式解析器本质上会接收“\”,它是某些事物的转义字符。您需要给正则表达式解析器其中两个以进行转义,因此在 Java 中,您需要执行 "\\\\" 来表示单个 "\" 的匹配

于 2012-07-24T15:06:50.683 回答
2

该正则表达式中的每个模式都需要5 个反斜杠字符。

采用:

singleLine.replaceAll("(\\\\\n|\\\\\r)", ""); 

反斜杠字符既是字符串的转义序列,也是正则表达式中的转义序列。因此,要在正则表达式中表示文字\,您需要使用4 个 \字符 - 您的正则表达式需要\\得到一个转义的反斜杠,并且每个都需要在 java 中转义String- 然后另一个来表示\nor \r

String str = "string with \\\n newline and \\\n newline ...";
String repl = str.replaceAll("(\\\\\n|\\\\\r)", "");
System.out.println("str: " + str);
System.out.println("repl: " + repl);

输出:

STR: string with \
 newline and \
 newline ...
REPL: string with  newline and  newline ...
于 2012-07-24T15:06:30.320 回答
1

由于 String 的不可变性,您需要将返回值分配给另一个 String 对象或同一个对象。

singleLine = singleLine.replaceAll("(\\\\n|\\\\r)", "");

更多信息在这里

于 2012-07-24T15:06:49.457 回答
1

请记住,字符串是不可变的。这意味着 replaceAll() 不会更改singleLine 中的字符串。您必须使用返回值来获取修改后的字符串。例如,你可以做

singleLine = singleLine.replaceAll("(\\\\n|\\\\r)", "");
于 2012-07-24T15:07:12.577 回答