正则表达式替换单个反斜杠,不包括那些后跟某些字符的反斜杠

时间:2011-02-22 18:41:38

标签: javascript regex replace backslash

我有一个正则表达式,如果没有跟随其中一个字符,则从字符串中删除任何反斜杠:\ /或}。

它应该变成这个字符串:

foo\bar\\batz\/hi

进入这个:

foobar\\batz\/hi

但问题在于它正在处理每个反斜杠。因此它遵循规则,因为它删除了第一个反斜杠,并忽略第二个反斜杠,因为它后跟另一个反斜杠。但当它到达第3个时,它会删除它,因为它不会被另一个跟随。

我当前的代码如下所示:str.replace(/\\(?!\\|\/|\})/g,"")

但结果字符串如下所示:foobar\batz\/hi

如何让它跳过第3个反斜杠?或者是做某种明确的否定搜索的案例&替换类型的东西?例如。替换'\',但不要替换'\\','\ /'或'\}'?

请帮忙! :)

修改

对不起,我应该解释一下 - 我正在使用javascript,所以我认为我不能做负面的看法......

3 个答案:

答案 0 :(得分:6)

你需要注意一个反斜杠,然后是一个反斜杠。或者更好:连续反斜杠的数量不均匀。在这种情况下,您需要保持偶数个反斜杠,并且只替换最后一个(如果没有后跟/{)。

您可以使用以下正则表达式执行此操作:

(?<!\\)(?:((\\\\)*)\\)(?![\\/{])

并将其替换为:

$1

其中第一个匹配组是匹配的第一个偶数反斜杠。

一个简短的解释:

(?<!\\)          # looking behind, there can't be a '\'
(?:((\\\\)*)\\)  # match an uneven number of backslashes and store the even number in group 1
(?![\\/{])       # looking ahead, there can't be a '\', '/' or '{'

简单的英文版本将会是:

  

匹配不均匀数量的反斜杠,(?:((\\\\)*)\\),后跟\\{/(?![\\/{])和< / em>前面没有反斜杠(?<!\\)

Java中的演示(请记住反斜杠是双重转义的!):

String s = "baz\\\\\\foo\\bar\\\\batz\\/hi";
System.out.println(s);
System.out.println(s.replaceAll("(?<!\\\\)(?:((\\\\\\\\)*)\\\\)(?![\\\\/{])", "$1"));

将打印:

baz\\\foo\bar\\batz\/hi
baz\\foobar\\batz\/hi

修改

不需要后视的解决方案如下:

([^\\])((\\\\)*)\\(?![\\/{])

并替换为:

$1$2

其中$1是开头的非反斜杠字符,而$2是非反斜杠字符后面的偶数(或零)反斜杠数。

答案 1 :(得分:2)

所需的正则表达式与\\.

一样简单

然而,您需要知道replace()的第二个参数可以是这样的函数:

result = string.replace(/\\./g, function (ab) { // ab is the matched portion of the input string
    var b = ab.charAt(1);
    switch (b) { // if char after backslash
    case '\\': case '}': case '/': // ..is one of these
        return ab; // keep original string
    default: // else
        return b; // replace by second char
    }
});

答案 2 :(得分:0)

你需要一个前瞻,就像你拥有的一样,也需要一个外观,以确保你不会删除第二个斜线(后面显然没有特殊字符。试试这个:

(?<![\\])[\\](?![\\\/\}])作为你的正则表达式