正则表达式转换查找实例单个\

时间:2010-03-03 18:22:24

标签: java regex

我希望将\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");

4 个答案:

答案 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)

我不确切知道您需要它,但您可以查看来自StringEscapeUtilsCommons Lang。他们有很多方法做这样的事情,如果你找不到你正在寻找的东西,你可以看看源头找到灵感:)

答案 3 :(得分:0)

使用altered = original.replaceAll("\\n", "\\\\n");有什么问题?这正是我本应该做的。