在Java中删除文本中的大空格

在Java中删除文本中的大空格,java,regex,string,Java,Regex,String,我试图删除一个大的空白,并在字符串中保留CR和LF字符。此字符串由LotusDominoAPI生成。这基本上是一个通过LotusAPI转换为文本的eml文件 当我执行以下操作时: String input = "This is a test string\r\nThis is another test string"; String tmp = input.replaceAll("\\s+", ""); System.out.println(tmp); Output:

我试图删除一个大的空白,并在字符串中保留CR和LF字符。此字符串由LotusDominoAPI生成。这基本上是一个通过LotusAPI转换为文本的eml文件

当我执行以下操作时:

String input = "This is a      test string\r\nThis is another       test string";
String tmp = input.replaceAll("\\s+", "");
System.out.println(tmp);


Output: 
This is a test string This is another test string

Desired Output : 
This is a test string\r\nThis is another test string

删除空白不是问题,但我无法在字符串中保留回车符和换行符。非常感谢您的帮助。

有一个简单的技巧,用否定字符类替换
\\s
[^\\s\\r\\n]
其中
\\s
是“所有非白色字符”

注意:如果要在单词之间保留空格,则必须将替换字符串更改为

例如:

String tmp = input.replaceAll("[^\\S\\r\\n]+", " ");
注意:您也可以使用类交叉点:
[\\s&&[^\\r\\n]]

String tmp = input.replaceAll(" +", " ");
正外观头不包括
\r\n
-
(?=.*?[^\r\n])

仅用1匹配并替换2个或更多空格

输出:

这是一个测试字符串\r\n这是另一个测试字符串

演示:
[^\\S\\r\\n]+
可能更好。@Dropout:我说:替换
\\S
而不是
\\S+
LOL,在关于正则表达式的问题中使用伪正则表达式。这才是核心。我收回这句话,你在技术上是对的。当我用你给出的否定字符类替换时,单词之间的空格也消失了,如下所示:
thisisteststring Thisisanotherteststring
但是CR和LF是retained@immzi:这就是我建议您使用
更改替换字符串的原因
而不是
来自Tuga和Lance Java的回答也解决了这个问题。但是来自@Casimir et Hippolyte的答案最符合我的需要,因此将其标记为公认的答案。再次感谢大家!而且比另一个更清楚。我想说的是更快。
String subject = "This is a      test string\r\nThis is another       test string";
String result = subject.replaceAll("(?=.*?[^\r\n])[\\s]{2,}", " ");;