字符串替换不起作用或我笨?

时间:2014-11-25 07:48:33

标签: java regex string replace

我有这个:

for (String[] aZkratkyArray1 : zkratkyArray) {
    String oldString = " " + aZkratkyArray1[0] + " ";
    String firstString = aZkratkyArray1[0] + " ";
    String newString = " " + aZkratkyArray1[1] + " ";
    System.out.println(newString);
    System.out.println(fileContentsSingle);
    fileContentsSingle = fileContentsSingle.replaceAll(oldString, newString);
    if (fileContentsSingle.startsWith(firstString)) {
        fileContentsSingle = aZkratkyArray1[1] + " " + fileContentsSingle.substring(firstString.length(),fileContentsSingle.length());
    }
}

fileContentsSingle只是一些常规字符串,aZkratkyArray是带有缩写词的数组,f.e。:

  • ht,你好
  • wru,你是谁

所以当fileContentsSingle = ht我是机器人 它应该结束:你好,我是机器人

或当fileContentsSingle =我是机器人hru 它应该结束:我是你的机器人

但是当我在此迭代后或在此期间sysout fileContentsSingle时,字符串永远不会改变。

我尝试了替换和替换所有,我尝试了我能想到的一切。

错误在哪里?

编辑: 这是我导入数组的方式:

        String[][] zkratkyArray;
        try {
            LineNumberReader lineNumberReader = new LineNumberReader(new FileReader("zkratky.csv"));
            lineNumberReader.skip(Long.MAX_VALUE);
            int lines = lineNumberReader.getLineNumber();
            lineNumberReader.close();

            FileReader fileReader = new FileReader("zkratky.csv");
            BufferedReader reader = new BufferedReader(fileReader);

            zkratkyArray = new String[lines + 1][2];
            String line;
            int row = 0;
            while ((line = reader.readLine()) != null) {
                String[] array = line.split(",");
                for (int i = 0; i < array.length; i++) {
                    zkratkyArray[row][i] = array[i];
                }
                row++;
            }
            reader.close();
            fileReader.close();
        } catch (FileNotFoundException e) {
            System.out.println("Soubor se zkratkami nenalezen.");
            zkratkyArray = new String[0][0];
        }

3 个答案:

答案 0 :(得分:1)

您的代码可以正常使用“我是机器人”。如果您在fileContentsSingle循环后打印for,它将打印出您希望打印的内容:

final String[][] zkratkyArray = new String[2][];
zkratkyArray[0] = new String[] { "ht", "hello there" };
zkratkyArray[1] = new String[] { "wru", "who are you" };

String fileContentsSingle = "ht I am robot";

for (String[] aZkratkyArray1 : zkratkyArray) {
    String oldString = " " + aZkratkyArray1[0] + " ";
    String firstString = aZkratkyArray1[0] + " ";
    String newString = " " + aZkratkyArray1[1] + " ";

    fileContentsSingle = fileContentsSingle.replaceAll(oldString, newString);
    if (fileContentsSingle.startsWith(firstString)) {
        fileContentsSingle = aZkratkyArray1[1] + " "
                + fileContentsSingle.substring(firstString.length(), fileContentsSingle.length());
    }
}

System.out.println(fileContentsSingle); // prints "hello there I am robot"

关于“我是机器人hru”,它不会起作用,因为“hru”位于String的末尾,而后面没有空格,而您正在替换的String是“ hru“(前后有空格)。

由于您不使用正则表达式,因此您不需要replaceAll(),而是可以使用replace()

使用regexp,您可以在该行的任何位置执行更通用的解决方案:

final String[][] zkratkyArray = new String[2][];
zkratkyArray[0] = new String[] { "ht", "hello there" };
zkratkyArray[1] = new String[] { "wru", "who are you" };

String fileContentsSingle = "ht I am robot wru";

for (String[] aZkratkyArray1 : zkratkyArray) {
    fileContentsSingle = fileContentsSingle.replaceAll("\\b" + Pattern.quote(aZkratkyArray1[0]) + "\\b",
            Matcher.quoteReplacement(aZkratkyArray1[1]));
}

System.out.println(fileContentsSingle); // hello there I am robot who are you

答案 1 :(得分:0)

我不认为你在这里使用任何正则表达式。你只是在阅读一个suustring并用另一个替换它。

只使用不使用正则表达式的其他版本:

fileContentsSingle.replace(oldString, newString);

答案 2 :(得分:0)

最后,我发现我在input.csv文件中有BOM。