使用正则表达式在Java中查找和替换,而不更改文件格式

时间:2015-04-14 18:31:32

标签: java regex

我的代码在名为 sample.txt 的文本文件中替换了10:A到12:A。此外,我现在的代码正在改变文件格式,不应该。有人可以让我知道如何使用Java中的正则表达式来改变文件格式吗?文件的格式如下:10:A
14:Saxws
但执行完代码后输出为10:A 14:Saxws。

import java.io.*;     
import java.util.*;     


public class FileReplace
{
    List<String> lines = new ArrayList<String>();
    String line = null;
    public void  doIt()
    {
        try
        {
            File f1 = new File("sample.txt");
            FileReader fr = new FileReader(f1);
            BufferedReader br = new BufferedReader(fr);
            while ((line = br.readLine()) != null)
            {
                if (line.contains("10:A"))
                    line = line.replaceAll("10:A", "12:A") + System.lineSeparator();
                lines.add(line);
            }
            fr.close();
            br.close();

            FileWriter fw = new FileWriter(f1);
            BufferedWriter out = new BufferedWriter(fw);
            for(String s : lines)
                 out.write(s);
            out.flush();
            out.close();
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
    public static void main(String[] args)
    {
        FileReplace fr = new FileReplace();
        fr.doIt();
    }
}

1 个答案:

答案 0 :(得分:2)

您的操作系统或编辑器似乎无法正确打印由System.lineSeparator()生成的行分隔符。在这种情况下考虑

  • 将整个文件的内容读取到字符串(包括原始行分隔符), - 然后替换您感兴趣的部分
  • 并将替换后的字符串写回您的文件

您可以使用以下代码执行此操作:

Path file = Paths.get("sample.txt");

//read all bytes from file (they will include bytes representing used line separtors)
byte[] bytesFromFile = Files.readAllBytes(file);

//convert themm to string
String textFromFile = new String(bytesFromFile, StandardCharsets.UTF_8);//use proper charset

//replace what you need (line separators will stay the same)
textFromFile = textFromFile.replaceAll("10:A", "12:A");

//write back data to file
Files.write(file, textFromFile.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE);