从String中删除所有空格但保留一个换行符

fri*_*oft 7 java string whitespace removing-whitespace

我有这个输入字符串(包含标签,空格,换行符):


        That      is a test.              
    seems to work       pretty good? working.








    Another test  again.
Run Code Online (Sandbox Code Playgroud)

[编辑]:我应该提供String以便更好地测试,因为stackoverflow会删除所有特殊字符(制表符,...)

String testContent = "\n\t\n\t\t\t\n\t\t\tDas      ist ein Test.\t\t\t  \n\tsoweit scheint das \t\tganze zu? funktionieren.\n\n\n\n\t\t\n\t\t\n\t\t\t      \n\t\t\t      \n    \t\t\t\n    \tNoch ein  Test.\n    \t\n    \t\n    \t";
Run Code Online (Sandbox Code Playgroud)

我希望达到这种状态:


That is a test.
seems to work pretty good? working.
Another test again.
Run Code Online (Sandbox Code Playgroud)
String expectedOutput = "Das ist ein Test.\nsoweit scheint das ganze zu? funktionieren.\nNoch ein Test.\n";
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?这可以用正则表达式来实现吗?

replaceAll("\\s+", " ")不是我想要的.如果这个正则表达式将保留现有的1个换行符,那将是完美的.

我试过这个,但这对我来说似乎不太理想......:

BufferedReader bufReader = new BufferedReader(new StringReader(testContent));
String line = null;
StringBuilder newString = new StringBuilder();
while ((line = bufReader.readLine()) != null) {
    String temp = line.replaceAll("\\s+", " ");
    if (!temp.trim().equals("")) {
        newString.append(temp.trim());
        newString.append("\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 14

在一个正则表达式(加上一个小标签补丁):

input.replaceAll("^\\s+|\\s+$|\\s*(\n)\\s*|(\\s)\\s*", "$1$2")
     .replace("\t"," ");
Run Code Online (Sandbox Code Playgroud)

正则表达式看起来令人生畏,但实际上很好地分解为OR-ed在一起的这些部分:

  • ^\s+ - 在开头匹配空格;
  • \s+$ - 最后匹配空格;
  • \s*(\n)\s* - 匹配包含换行符的空格,并捕获该换行符;
  • (\s)\s* - 匹配空格,捕获第一个空白字符.

结果将与两个捕获组匹配,但一次只能有一个组非空.这允许我替换匹配"$1$2",这意味着"连接两个捕获组".

唯一剩下的问题是我不能使用这种方法用空格替换选项卡,所以我用一个简单的非正则字符替换来解决这个问题.


MBO*_*MBO 6

分4个步骤:

text
    // 1. compress all non-newline whitespaces to single space
    .replaceAll("[\\s&&[^\\n]]+", " ")
    // 2. remove spaces from begining or end of lines
    .replaceAll("(?m)^\\s|\\s$", "")
    // 3. compress multiple newlines to single newlines
    .replaceAll("\\n+", "\n")
    // 4. remove newlines from begining or end of string
    .replaceAll("^\n|\n$", "") 
Run Code Online (Sandbox Code Playgroud)