我有这个输入字符串(包含制表符、空格、换行符):
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/