java - 从字符串中删除所有空格但保留一个换行符

标签 java string whitespace removing-whitespace

我有这个输入字符串(包含制表符、空格、换行符):


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








    Another test  again.

[编辑]:我应该提供字符串以便更好地测试,因为 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";

我想达到这样的状态:


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

String expectedOutput = "Das ist ein Test.\nsoweit scheint das ganze zu? funktionieren.\nNoch ein Test.\n";

有什么想法吗?这可以使用正则表达式来实现吗?

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");
    }
}

最佳答案

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

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

正则表达式看起来令人生畏,但实际上可以很好地分解为这些通过“或”运算组合在一起的部分:

  • ^\s+ – 匹配开头的空格;
  • \s+$ – 匹配末尾的空格;
  • \s*(\n)\s* – 匹配包含换行符的空格,并捕获该换行符;
  • (\s)\s* – 匹配空格,捕获第一个空格字符。

结果将与两个捕获组匹配,但一次只有一个组可能是非空的。这允许我用 "$1$2" 替换匹配项,这意味着“连接两个捕获组。”

唯一剩下的问题是我无法使用这种方法将制表符替换为空格,因此我使用简单的非正则表达式字符替换来解决这个问题。

关于java - 从字符串中删除所有空格但保留一个换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15494780/

相关文章:

java - Docker 上的弹性 APM 堆栈

objective-c - 将字符串与 Objective-C 中的数组进行比较

java - 为什么我不能将二进制字符串与空格连接起来? (就像下面的例子)

git、空格错误、压缩和 autocrlf,最终答案

java - 如何使用Java将数据从一个ArrayList添加到另一个ArrayList?

java - 将 @AuthenticationPrincipal 与 JwtAuthenticationToken 一起使用以使用自己的用户类

java - 显示对象列表

c# - 为什么 String S =new string() 在 C# 中无效

ruby - 在匹配特定条件时拆分字符串

java - 如何在扫描时忽略空白