如何使用正则表达式删除以空格结尾的每个字符串行中的换行符? Java的

时间:2015-07-22 20:11:49

标签: java regex string file

我逐行循环浏览文本文件,对于每一行,我检查一行"是否以空格和换行符\n"结尾,然后我要取消换行并离开空间。

  • 一个例子:

假设我有一个包含以下文字的文本文件:

Hello world, this is me.

注意:" Hello world,"之后有一个空格。和换行。

  • 预期结果:

Hello world, this is me.

这是我的代码:

String line;
while ((line = br.readLine()) != null) {
    if (line.endsWith(" ")) {
        bw.write(line.replaceFirst(" \n", " "));
    }
}

正则表达式看起来效果不佳。它匹配第一个空格而不考虑换行\n条件!有任何想法吗?我只想取消以空格结尾的每个字符串行中的换行符。

  • 注意:文本文件中未明确显示换行符\n

1 个答案:

答案 0 :(得分:4)

根据我对您的问题的解读,看起来您想要转变:

A line
Another line that ends with a space_
Finally the end

_表示尾随空格的地方):

A line
Another line that ends with a space Finally the end

如果是这种情况,应该这样做(假设bwBufferedWriter):

String line;
while ((line = br.readLine()) != null) {
    /* We always write out the line (without an end-of-line character(s)) */
    bw.write(line);

    /* If the line does not end with a space, write out an end-of-line character */
    if (!line.endsWith(" ")) {
        bw.newLine();
    }
}

更新:您要求解释您的代码无效的原因,以下是您的代码:

/* 1 */ String line;
/* 2 */ while ((line = br.readLine()) != null) {
/* 3 */     if (line.endsWith(" ")) {
/* 4 */         bw.write(line.replaceFirst(" \n", " "));
/* 5 */     }
/* 6 */ }

第1,5和6行无需解释。

  • 第2行:您向BufferedReader询问一行,并检查返回的String是否不是null。如果是null,那么您已到达流的末尾。
  • 第3行:您检查line是否以空格结尾。
  • 第4行:您在replaceFirst上致电line,并将结果写为bwBufferedWriter

<强>问题

  • 第3行:如果line 以空格结尾,则line不执行任何操作。你根本不写出来。
  • 第4行:对replaceFirst的调用永远不会做任何事情,因为" \n"永远不会匹配。关于问题本身和这个答案,有很多关于这一点的评论,但是你很清楚:String返回的BufferedReader.readLine() 永远不会包含行尾字符,如the documentation for BufferedReader.readLine()所述:
  

返回:包含行内容的字符串,不包括任何行终止字符;如果已到达流末尾,则返回null