我希望将\n
替换为\\n
,但到目前为止,我的正则表达式尝试无法正常工作(实际上它本身就是任何\,\ n恰好是我用过的用例数据)。
我需要的是:
any-non-\ followed by \ followed by any-non-\
最终我会将正则表达式传递给java.lang.String.replaceAll,因此为此格式化的正则表达式会很棒,但我可以将另一种样式正则表达式转换为我需要的。
例如我在此程序之后打印出“true”......
public class Main
{
public static void main(String[] args)
{
final String original;
final String altered;
final String expected;
original = "hello\nworld";
expected = "hello\\nworld";
altered = original.replaceAll("([^\\\\])\\\\([^\\\\])", "$1\\\\$2");
System.out.println(altered.equals(expected));
}
}
使用它确实有效:
altered = original.replaceAll("\\n", "\\\\n");
答案 0 :(得分:2)
字符串应为
"[^\\\\]\\\\[^\\\\]"
你必须在一个字符串常量中四倍反斜杠,这是一个正则表达式;如果你只加倍它们,它们将被转义为字符串而不是正则表达式。
所以实际的代码是
myString = myString.replaceAll("([^\\\\])\\\\([^\\\\])", "$1\\\\$2");
请注意,在替换中,四重反斜杠现在被解释为两个反斜杠而不是一个反斜杠,因为正则表达式引擎没有解析它。 编辑:实际上,正则表达式引擎会解析它,因为它必须检查反向引用。
编辑:上面假设输入字符串中有一个文字\n
,它以字符串文字表示为"\\n"
。由于它显然有换行符(表示为"\n"
),因此正确的替换将是
myString = myString.replaceAll("\\n", "\\\\n");
必须对任何其他特殊字符(\t
,\r
,\0
,\\
等)重复此操作。 如上所述,替换字符串看起来与正则表达式字符串完全相同,但不是。
答案 1 :(得分:1)
所以每当有1个反斜杠时,你想要2个,但是如果连续有2个,3个或4个......那就别管它们了吗?
你想要替换
(?<=[^\\])\\(?!\\+)([^\\])
带
\\$1
更改字符串
hello\nworld and hello\\nworld and hello\\\nworld
到
hello\\nworld and hello\\nworld and hello\\\nworld
答案 2 :(得分:0)
我不确切知道您需要它,但您可以查看来自StringEscapeUtils
的Commons Lang。他们有很多方法做这样的事情,如果你找不到你正在寻找的东西,你可以看看源头找到灵感:)
答案 3 :(得分:0)
使用altered = original.replaceAll("\\n", "\\\\n");
有什么问题?这正是我本应该做的。