Java代码处理需要替换为其他特殊字符的特殊字符

3
我正在编写Java代码,处理从主机接收的字符串,其中包含需要用其他特殊字符替换的特殊字符。我的搜索字符是§ÄÖÜäüßö@[\]~{¦},替换字符是@[\]{}~¦§ÄÖÜßäöü。因此,如果字符串中有一个{,我需要用ä进行替换。我的输入示例是"0.201322.05.2017LM-R{der Dopp"
目前我的代码如下:
        String repChar = "§ÄÖÜäüßö@[\\\\]~{¦}@[\\\\]{}~¦§ÄÖÜßäöü";
        // Split String and Convert
        String repCharin = repChar.substring(0, repChar.length()/2-1);
        String repCharout = repChar.substring(repChar.length()/2, repChar.length()-1);          
        String strblob = new String(utf8ContentIn);
        // Convert  
        for (int j=0; j < repCharin.length();j++) {
            strblob = strblob.replace(repCharin.substring(j, 1), repCharout.substring(j, 1));                               
        }
        byte [] utf8Content = strblob.getBytes();

但它会生成以下错误:

java.lang.StringIndexOutOfBoundsException at java.lang.String.substring(String.java:1240)

“\\”是转义字符,我只需要一个“\”。

你之所以出现错误,是因为你在遍历字符串的长度时同时改变了字符串。 - Shane
1
哪一行抛出了异常?我可以说的是 strblob = strblob.replace(repCharin.substring(j, 1), repCharout.substring(j, 1)); 可能应该是 strblob = strblob.replace(repCharin.substring(j, j+1), repCharout.substring(j, j+1)); - Zedee.Chen
我建议获取这些字符的字节表示,并完全在字节模式下工作,而不是使用字符串操作。请记住,某些字符编码需要多个字节。 - Minh Kieu
.substring 调用初始化 repCharinrepCharout 都是错误的 - 它们提取的字符串长度都短了一个字符。在我看来,你应该放弃这种无意义的方法,直接使用正确的字符串字面量来初始化 repCharinrepCharout - Kevin Anderson
1个回答

1

代码

    String utf8ContentIn = "0.201322.05.2017LM-R{der Dopp";

    String repChar = "§ÄÖÜäüßö@[\\]~{¦}@[\\]{}~¦§ÄÖÜßäöü";
    // Split String and Convert
    String repCharin = repChar.substring(0, repChar.length() / 2);
    String repCharout = repChar.substring(repChar.length() / 2, repChar.length());
    String strblob = new String(utf8ContentIn);

    String output = strblob.chars().mapToObj(c -> {
        char ch = (char) c;
        int index = repCharin.indexOf(c);
        if (index != -1) {
            ch = repCharout.charAt(index);
        }
        return String.valueOf(ch);
    }).collect(Collectors.joining());

    System.out.println(output);

将会按照您的期望打印出"0.201322.05.2017LM-Räder Dopp"。这里的问题(除了在分离过程中使用不正确的索引)是您应该迭代输入字符串而不是字符。因为您可能会遇到这样的情况,即将Ä替换为[,然后威胁[再次作为特殊字符,并将其第二次替换为Ä

此外,单个反斜杠应该用单个反斜杠转义,所以要得到\,您需要\\

希望能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接