如何从Java中的文件中删除换行符?
Posted
技术标签:
【中文标题】如何从Java中的文件中删除换行符?【英文标题】:How to remove line breaks from a file in Java? 【发布时间】:2011-01-10 21:45:37 【问题描述】:如何以适用于 Windows 和 Linux 的方式替换 Java 中字符串中的所有换行符(即没有操作系统特定的回车/换行/换行等问题)?
我试过(注意 readFileAsString 是一个将文本文件读入字符串的函数):
String text = readFileAsString("textfile.txt");
text.replace("\n", "");
但这似乎不起作用。
如何做到这一点?
【问题讨论】:
您想消除所有换行符吗?或者您想将它们统一为标准解决方案? 哦,如果要删除所有换行符,请删除所有\n和所有\r(因为Windows换行符是\r\n)。 嘿,仅供参考,如果您想用单个换行符替换同时的多换行符,那么您可以使用myString.trim().replaceAll("[\n]2,", "\n")
或用单个空格替换 myString.trim().replaceAll("[\n]2,", " ")
【参考方案1】:
你需要将text
设置为text.replace()
的结果:
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");
这是必要的,因为字符串是不可变的——调用replace
不会更改原始字符串,它会返回一个已更改的新字符串。如果您不将结果分配给text
,则该新字符串将丢失并被垃圾回收。
至于获取任何环境的换行字符串——可通过调用System.getProperty("line.separator")
获得。
【讨论】:
+1,正确。至于原因:String是不可变的。replace()
方法返回所需的结果。另请参阅 API 文档:java.sun.com/javase/6/docs/api/java/lang/… 编辑: 啊,你已经在之后自己编辑了 :)
也许text = text.replace("\r\n", " ").replace("\n", " ");
是一个更好的解决方案:否则单词将相互“粘合”(没有单个空格替换)。
您还可以使用方括号为任何操作系统正确匹配换行符:.replaceAll("[\\r\\n]+", "")
由于问题是要求替换所有出现,因此解决方案是text = text.replaceAll("\n", "").replaceAll("\r", "");
@basZero replaceAll
接受正则表达式,replace
接受文字字符串,都替换所有出现。【参考方案2】:
如其他答案所述,您的代码主要不起作用,因为String.replace(...)
不会更改目标String
。 (它不能——Java 字符串是不可变的!)replace
实际上所做的是创建并返回一个新的String
对象,并根据需要更改字符。但是您的代码随后会丢弃 String
...
这里有一些可能的解决方案。哪一个最正确取决于您到底想做什么。
// #1
text = text.replace("\n", "");
只需删除所有换行符。这不适用于 Windows 或 Mac 行终止。
// #2
text = text.replace(System.getProperty("line.separator"), "");
删除当前平台的所有行终止符。这不适用于您尝试在 Windows 上处理(例如)UNIX 文件的情况,反之亦然。
// #3
text = text.replaceAll("\\r|\\n", "");
删除所有 Windows、UNIX 或 Mac 行终止符。但是,如果输入文件是文本,这将连接单词;例如
Goodbye cruel
world.
变成
Goodbye cruelworld.
所以你可能真的想这样做:
// #4
text = text.replaceAll("\\r\\n|\\r|\\n", " ");
将每个行终止符替换为空格1。从 Java 8 开始,您也可以这样做:
// #5
text = text.replaceAll("\\R", " ");
如果你想用一个空格替换多行终止符:
// #6
text = text.replaceAll("\\R+", " ");
1 - 请注意#3 和#4 之间存在细微差别。序列\r\n
表示单个(Windows)行终止符,因此我们需要注意不要将其替换为两个空格。
【讨论】:
这是一个很好的答案。感谢 Java 8 示例。感谢您的帮助! 谢谢这对我有用...顺便说一句,你能解释一下 text = text.replaceAll("\\r\\n|\\r|\\n", " ");【参考方案3】:This function 将所有空格(包括换行符)归一化为单个空格。不完全是原始问题所要求的,但在许多情况下可能完全符合需要:
import org.apache.commons.lang3.StringUtils;
final String cleansedString = StringUtils.normalizeSpace(rawString);
【讨论】:
【参考方案4】:如果您只想删除在当前操作系统上有效的行终止符,您可以这样做:
text = text.replaceAll(System.getProperty("line.separator"), "");
如果您想确保删除任何行分隔符,您可以这样做:
text = text.replaceAll("\\r|\\n", "");
或者,稍微冗长一些,但不那么正则表达式:
text = text.replaceAll("\\r", "").replaceAll("\\n", "");
【讨论】:
为了避免将单词粘合在一起(如 cmets 对 Kaleb 的回答所讨论的那样),正则表达式方法可以修改为text.replaceAll("(\\r|\\n)+", " ")
并且(假设贪婪在 Java 中是默认的?)您将有一个解决方案,只需 一个空格用于每个新行字符序列。【参考方案5】:
我猜这会很有效
String s;
s = "try this\n try me.";
s.replaceAll("[\\r\\n]+", "")
【讨论】:
确保您拥有完全相同的代码,而不是在粘贴时丢失“\n”字符。因为它应该工作。也许是因为我忘记了最后的分号(;)。【参考方案6】:str = str.replaceAll("\\r\\n|\\r|\\n", " ");
在搜索了很多之后,对我来说效果很好,其他行都失败了。
【讨论】:
我试图单独做,不知道为什么它不起作用,这个就像魅力一样。【参考方案7】:windows/linux/mac下的换行符不一样。您应该使用带有属性 line.separator 的System.getProperties。
【讨论】:
【参考方案8】:String text = readFileAsString("textfile.txt").replaceAll("\n", "");
虽然 oracle 网站中 trim() 的定义是 "返回字符串的副本,省略前导和尾随空格。"
文档没有说明新行字符(前导和尾随)也将被删除。
简而言之
String text = readFileAsString("textfile.txt").trim();
也适用于您。
(使用 Java 6 检查)
【讨论】:
【参考方案9】:String text = readFileAsString("textfile.txt").replace("\n","");
.replace 返回一个新字符串,Java 中的字符串是不可变的。
【讨论】:
【参考方案10】:您可能希望使用BufferedReader
阅读您的文件。此类可以将输入分解为单独的行,您可以随意组合这些行。 BufferedReader
的运行方式自动识别 Linux、Windows 和 MacOS 世界的行结束约定,无论当前平台如何。
因此:
BufferedReader br = new BufferedReader(
new InputStreamReader("textfile.txt"));
StringBuilder sb = new StringBuilder();
for (;;)
String line = br.readLine();
if (line == null)
break;
sb.append(line);
sb.append(' '); // SEE BELOW
String text = sb.toString();
请注意,readLine()
在返回的字符串中不包含行终止符。上面的代码附加了一个空格,以避免将一行的最后一个单词和下一行的第一个单词粘在一起。
【讨论】:
【参考方案11】:我觉得奇怪的是(Apache)StringUtils 还没有在这里介绍。
您可以使用.replace
方法从字符串中删除所有换行符(或任何其他出现的子字符串)
StringUtils.replace(myString, "\n", "");
此行将用空字符串替换所有换行符。
因为换行符在技术上是一个字符,所以您可以选择使用 .replaceChars
方法来替换字符
StringUtils.replaceChars(myString, '\n', '');
【讨论】:
StringUtils.replaceEachRepeatedly(myString, new String[]"\n", "\t", new String[]StringUtils.Empty, StringUtils.Empty);
【参考方案12】:
仅供参考,如果您想用单个换行符替换同时的多换行符,那么您可以使用
myString.trim().replaceAll("[\n]2,", "\n")
或者用一个空格替换
myString.trim().replaceAll("[\n]2,", " ")
【讨论】:
【参考方案13】:您可以使用 apache commons IOUtils 遍历该行并将每一行附加到 StringBuilder。并且不要忘记关闭 InputStream
StringBuilder sb = new StringBuilder();
FileInputStream fin=new FileInputStream("textfile.txt");
LineIterator lt=IOUtils.lineIterator(fin, "utf-8");
while(lt.hasNext())
sb.append(lt.nextLine());
String text = sb.toString();
IOUtils.closeQuitely(fin);
【讨论】:
【参考方案14】:您可以使用泛型方法将任何字符替换为任何字符。
public static void removeWithAnyChar(String str, char replceChar,
char replaceWith)
char chrs[] = str.toCharArray();
int i = 0;
while (i < chrs.length)
if (chrs[i] == replceChar)
chrs[i] = replaceWith;
i++;
【讨论】:
【参考方案15】:在 Kotlin 中,以及从 Java 11 开始,String
具有 lines()
方法,该方法返回多行字符串中的行列表。
您可以获取所有行,然后将它们合并为一个字符串。
使用 Kotlin 将变得如此简单
str.lines().joinToString("")
【讨论】:
这对于所要求的内容根本没有用。 问题指出:“替换字符串中的所有换行符” - 而解决方案正是这样做的,以一种简单、干净和可靠的方式。 他们差不多 12 年前就问过 Java - 你对 Kotlin 的回答没有任何用处 我的答案包含有关 Java 方法的信息:...since Java 11, String has lines() method...
。 Kotlin 示例是一个奖励。【参考方案16】:
org.apache.commons.lang.StringUtils#chopNewline
【讨论】:
-1 因为Deprecated 并且仅在字符串末尾删除。【参考方案17】:尝试这样做:
textValue= textValue.replaceAll("\n", "");
textValue= textValue.replaceAll("\t", "");
textValue= textValue.replaceAll("\\n", "");
textValue= textValue.replaceAll("\\t", "");
textValue= textValue.replaceAll("\r", "");
textValue= textValue.replaceAll("\\r", "");
textValue= textValue.replaceAll("\r\n", "");
textValue= textValue.replaceAll("\\r\\n", "");
【讨论】:
如果你替换了\n
,那么如果你替换了\n,那么\r\n
就没有了,并且有一个\\n,它将被替换,所以只保留\。以上是关于如何从Java中的文件中删除换行符?的主要内容,如果未能解决你的问题,请参考以下文章