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",这意味着"连接两个捕获组".
唯一剩下的问题是我不能使用这种方法用空格替换选项卡,所以我用一个简单的非正则字符替换来解决这个问题.
分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)