如何从 trim() 方法中排除“\n”转义字符?

How to exclude "\n" escape character from trim() method?

提问人:eaidy 提问时间:8/9/2023 更新时间:8/9/2023 访问量:86

问:

给定文本,它包含信息行作为换行符。我需要执行类似自定义解析之类的操作来拆分这些行并将它们保存到数组中。由于文本中的新行由转义字符“\n”确定,因此我根据这些转义字符执行解析。问题是,一些文本数据在主数据文本之外有很多空格。当我继续执行另一个拆分操作以将行转换为键值对时,这些空格在运行时给我带来了问题。

Java 中有什么方法可以让我修剪字符串但排除“\n”转义字符?

Java 修剪

评论

3赞 Federico klez Culloca 8/9/2023
我不清楚输入文本是什么样子的,输出会是什么。您能否编辑您的问题以包含此文本的相关示例和您期望的输出?无法从 中排除字符,但可以通过知道输入和输出的替代解决方案。trim
0赞 tostao 8/9/2023
请添加一些示例,您做过/尝试过什么以及需要什么。
3赞 Slevin 8/9/2023
你为什么不拆分,修剪,然后添加到每一行?在换行符上拆分时,像这样的序列无论如何都会丢失,之后必须放回去。无论如何,我宁愿建议拆分哪个是 Java 检测新行的新版本:\n\ntext.split("\n")\\Rtext.split("\\R")
0赞 user16320675 8/9/2023
如果要保留所有参数(包括文本末尾的参数),请添加第二个参数,如(@Slevin建议)text.split("\n", -1)\n
0赞 user16320675 8/9/2023
我也会测试(但不确定我是否正确理解了这个问题)text.stripIndent().indent(Integer.MIN_VALUE)

答:

0赞 Michael Gantman 8/9/2023 #1

您将不得不手动完成,但这并不难。如果您已经根据字符将字符串拆分为多个字符串,则所有字符串将只有一次字符或根本没有字符,如果您的字符串具有字符,则它始终是最后一个。所以,你可以做的是\n\n\n

boolean newLinePresent = myString.endsWith("\n");
myString = myString.trim();
if(newLinePresent) {
  myString = myString + "\n";
}

评论

2赞 Lii 8/9/2023
别忘了它返回一个 NEW 字符串,它不会修改字符串!您必须将返回值分配给某些东西。trim
0赞 Michael Gantman 8/9/2023
是的,修改了代码,感谢您的捕获,但这并不能消除答案的清晰度
3赞 VGR 8/9/2023 #2

如果要从文件中读取,请不要将整个文件内容读取到单个字符串中。相反,修剪每行:

List<String> lines = new ArrayList<>();

try (BufferedReader reader = Files.newBufferedReader(
        Path.of("C:\\Users\\caliskanata\\Documents\\file.txt"))) {

    String line;
    while ((line = reader.readLine()) != null) {
        lines.add(line.trim());
    }
}

如果你的文本不是来自文件,你可以按照 Slevin 的建议拆分它,并修剪每个部分:

String[] untrimmedLines = text.split("\\R");
List<String> lines = new ArrayList<>(untrimmedLines.length);
for (String untrimmedLine : untrimmedLines) {
    lines.add(untrimmedLine.trim());
}

您也可以使用 Stream 来执行此操作:

List<String> lines =
    Pattern.compile("\\R").splitAsStream(text).map(String::trim).toList();

由于您编写了“将它们保存到数组中”,因此您可以轻松地将 List 转换为数组:

String[] array = lines.toArray(String[]::new);

评论

0赞 user16320675 8/9/2023
但请注意,使用 one-argument 会丢弃文本末尾的所有换行符(甚至可能是想要的?split()