Java 字符串替换不工作或Im哑?

Java 字符串替换不工作或Im哑?,java,regex,string,replace,Java,Regex,String,Replace,我有这个: for (String[] aZkratkyArray1 : zkratkyArray) { String oldString = " " + aZkratkyArray1[0] + " "; String firstString = aZkratkyArray1[0] + " "; String newString = " " + aZkratkyArray1[1] + " "; System.out.println(newString);

我有这个:

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是带有缩短单词的数组,例如:

  • 哈啰,你好
  • 哦,你是谁
所以当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];
        }
String[]zkratkyArray;
试一试{
LineNumberReader LineNumberReader=新的LineNumberReader(新文件阅读器(“zkratky.csv”);
lineNumberReader.skip(长最大值);
int lines=lineNumberReader.getLineNumber();
lineNumberReader.close();
FileReader FileReader=newFileReader(“zkratky.csv”);
BufferedReader reader=新的BufferedReader(文件读取器);
zkratkyArray=新字符串[行+1][2];
弦线;
int行=0;
而((line=reader.readLine())!=null){
String[]数组=line.split(“,”);
for(int i=0;i
我认为您在这里没有使用任何正则表达式。你只是在读一个suustring,然后用另一个替换它

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

fileContentsSingle.replace(oldString, newString);

您的代码将正确用于“ht I am robot”。如果在
for
循环之后打印
fileContentsSingle
,它将打印您希望打印的内容:

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”位于
字符串的末尾,后面没有空格,而要替换的
字符串是“hru”(前后都有空格)

因为不使用regexp,所以不需要,也可以使用

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

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

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

你的意思是
replace(String,String)
?是的,我错了,这就是我的意思。@FilipKraus它起作用了,看看我在哪里粘贴了第一块代码,它正确地打印了“你好,我是机器人”。我修改了我的代码。如果我要使用你的代码,你能帮我编辑我的输入,使其适用于你的代码吗?这将对我有很大帮助。@FilipKraus和我甚至用CSV导入代码对它进行了测试,以填充数组,它仍然有效。你确定你的CSV分隔符是“,”?是的,我100%确定,单词是这样的:快捷方式,单词快捷方式,单词,所以当我在aZkratkyArray1[0]和[1]上测试sout时,单词后面有逗号和空格,它真的会打印导入的数据,如ht hellothere和下一次迭代wru=你是谁,等等。。。但它不能取代任何东西。即使使用您的代码:for(String[]aZkratkyArray1:zkratkyArray){fileContentsSingle=fileContentsSingle.replaceAll(“\\b”+Pattern.quote(aZkratkyArray1[0])+“\\b”,Matcher.quoteReplacement(aZkratkyArray1[1]);}