不使用替换功能替换另一个单词

时间:2016-11-11 11:34:16

标签: java string replace words randomaccessfile

我需要在不使用文本中的replacereplaceAll函数的情况下替换另一个单词。

如果我要替换的单词与原单词的长度相同,则没有任何问题。问题是当我要替换的单词比原始单词更长或更短时。

例如:我想在“我有一只狗”字符串中将“one”替换为“13”。这就是我尝试做的事情(我使用RandomAccessFile类):

RandomAccessFile r  = new RandomAccessFile("toto.txt","rw")
r.seek(position); // imagine that position is the right cursor which take place under the o from the word "one"
r.writeBytes("thirteen");

当我尝试这个时,我会删除狗后的单词,因为“十三”比“一”长。

如果我要替换的单词比原始单词短,则同样的问题。我用空白字母替换了剩余的字母,但我有空白空间......

我该怎么办?

4 个答案:

答案 0 :(得分:1)

我会这样做:

  • 对于文件中的每一行
  • 替换行中的内容
  • 将行写入临时文件
  • 将所有内容从临时文件写回原始文件

如果文件不大,可以将行保留在内存中,而不是写入临时文件。

您可以删除原始文件并将临时文件重命名为原始文件名,而不是将所有内容都写回来。

答案 1 :(得分:1)

您可以阅读整个文件,然后使用String的replace。有两种不同的结果:

  1. 新字符串更短 - 在这种情况下我们在末尾填充字符串
  2. 新字符串的长度或长度相同 - 这不应该是一个问题,因为RandomAccessFile会扩展文件。
  3. 我们从位置0写newString - RandomAccessFile就像数组一样工作,因此内容被覆盖。

    RandomAccessFile r  = new RandomAccessFile("toto.txt","rw");
    
    //read the content 
    byte[] buffer = new byte[(int)r.length()];
    r.read(buffer);
    String str = new String(buffer, "UTF-8");
    
    //replace and pad right to get at least the same length
    String newString = str.replaceAll("one","three");
    str = String.format("%1$"+str.length()+ "s", newString);
    
    //write back to the file
    r.seek(0);
    r.writeBytes(newString);
    r.close();
    

答案 2 :(得分:0)

尝试使用String与数组一样:使用https://en.wikipedia.org/wiki/Boyer - Moore_string_search_algorithm并替换字符。当然,您需要修改数组长度。

答案 3 :(得分:0)

RandomAccessFile就像一个数组。您可以覆盖值,但不能在中间插入任何内容。您可以做的是setLength以根据需要补偿和转移现有文本。

我不确定它是否比Mats391建议的更好“解决方案”。它可能是最短(但不是最简单)的方式。