我有这个输入字符串(包含标签,空格,换行符):
That is a test.
seems to work pretty good? working.
Another test again.
[编辑]:我应该提供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";
我希望达到这种状态:
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");
}
}
答案 0 :(得分:14)
在单个正则表达式中(加上标签的小补丁):
input.replaceAll("^\\s+|\\s+$|\\s*(\n)\\s*|(\\s)\\s*", "$1$2")
.replace("\t"," ");
正则表达式看起来令人生畏,但实际上很好地分解为这些OR-ed在一起的部分:
^\s+
- 在开头匹配空格; \s+$
- 最后匹配空格; \s*(\n)\s*
- 匹配包含换行符的空格,并捕获该换行符; (\s)\s*
- 匹配空格,捕获第一个空格字符。结果将与两个捕获组匹配,但一次只能有一个组非空。这允许我用"$1$2"
替换匹配,这意味着“连接两个捕获组。”
唯一剩下的问题是我无法使用这种方法用空格替换制表符,所以我用一个简单的非正则字符替换来解决这个问题。
答案 1 :(得分: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$", "")
答案 2 :(得分:2)
如果我理解正确,您只想用一个换行符替换一系列换行符。因此,将\n\n*
替换为\n
(使用适当的标记)。如果行中有很多空格,只需先删除空格(^\s\s*$
多行模式),然后替换换行符。
编辑: 这里唯一的问题是一些换行可能会在这里和那里保留,所以你必须小心首先折叠空格,然后修复空行问题。你可以将它进一步削减成一个正则表达式,但用这三个更容易阅读:
Pattern spaces = Pattern.compile("[\t ]+");
Pattern emptyLines = Pattern.compile("^\\s+$?", Pattern.MULTILINE);
Pattern newlines = Pattern.compile("\\s*\\n+");
System.out.print(
newlines.matcher(emptyLines.matcher(spaces.matcher(
input).replaceAll(" ")).replaceAll("")).replaceAll("\n"));
答案 3 :(得分:2)
首先用一行替换所有新行,然后替换空格但不是新行,最后,你应该删除字符串开头的所有空格:
String test = " This is a real\n\n\n\n\n\n\n\n\n test !!\n\n\n bye";
test = test.replaceAll("\n+", "\n");
test = test.replaceAll("((?!\n+)\\s+)", " ");
test = test.replaceAll("((?!\n+)\\s+)", "");
输出:
This is a real
test !!
bye
答案 4 :(得分:1)
你为什么不这样做
String[] lines = split(s,"\n")
String[] noExtraSpaces = removeSpacesInEachLine(lines)
String result = join(noExtraSpaces,"\n")