0

我收到来自其他程序的消息,其中某些字符已更改:

\n(输入)->#

(哈希)#->\#

\->\\\\

当我试图用我的代码来扭转这些变化时,它不起作用,可能就是这样

请注意,替换字符串中的反斜杠 () 和美元符号 ($) 可能会导致结果与将其视为文字替换字符串时的结果不同。如上所述,美元符号可以被视为对捕获的子序列的引用,并且反斜杠用于转义替换字符串中的文字字符。

这是我的代码:

public String changeChars(final String message) {

    String changedMessage = message;

    changedMessage = changePattern(changedMessage, "[^\\\\][#]", "\n");
    changedMessage = changePattern(changedMessage, "([^\\\\][\\\\#])", "#");
    changedMessage = changePattern(changedMessage, "[\\\\\\\\\\\\\\\\]", "\\\\");

    return changedMessage;
}

private String changePattern(final String message, String patternString, String replaceString) {
    Pattern pattern = Pattern.compile(patternString);
    Matcher matcher = pattern.matcher(message);
    return matcher.replaceAll(replaceString);
}
4

1 回答 1

1

我假设您的编码方法是这样工作的。

  1. 全部替换\\\\\
  2. 标记最初放置#\#
  3. 现在,既然我们知道所有最初放置#的都\在它之前,我们可以用它来标记新\n#

代码可能类似于

data = data.replace("\\", "\\\\\\\\");
data = data.replace("#", "\\#");
data = data.replace("\n", "#");

要反转此操作,我们需要从头开始(形成最后替换)

  • 我们将用新的行标记替换它之前#没有的所有内容(如果我们从第二个替换开始->我们以后不会知道哪个ware 替换)。\\n\###\n
  • 之后我们可以安全地替换\##(这样我们将摆脱\原始字符串中没有的其他内容,并且不会打扰我们最后的替换步骤)。
  • 最后我们替换\\\\\.

这是我们如何做到的。

//your previous regex [^\\\\][#] describes "any character that is not \ and #
//but since we don't want to include that additional non `\` mark while replacing 
//we should use negative look-behind mechanism "(?<!prefix)"
data = data.replaceAll("(?<!\\\\)#", "\n");

//now since we got rid of additional "#" its time to replace `\#` to `#`
data = data.replace("\\#", "#");

//and lastly `\\\\` to `\`
data = data.replace("\\\\\\\\", "\\");
于 2013-01-01T21:03:05.830 回答