6

我有一个正则表达式,如果后面没有以下字符之一,它会从字符串中删除任何反斜杠:\ / 或}。

它应该转动这个字符串:

foo\bar\\batz\/hi

进入这个:

foobar\\batz\/hi

但问题是它正在处理每个反斜杠。所以它遵循规则,因为它删除了第一个反斜杠,并忽略了第二个反斜杠,因为它后面跟着另一个反斜杠。但是当它到达第三个时,它会删除它,因为它后面没有另一个。

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

但生成的字符串如下所示:foobar\batz\/hi

如何让它跳过第三个反斜杠?还是做某种明确的否定搜索和替换类型的事情?例如。替换 '\',但不要替换 '\\'、'\/' 或 '\}'?

请帮忙!:)

编辑

抱歉,我应该解释一下 - 我正在使用 javascript,所以我不认为我可以做负面的回顾......

4

3 回答 3

6

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

您可以使用以下正则表达式来做到这一点:

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

并将其替换为:

$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 '{'

用简单的英语会写成:

匹配奇数个反斜杠, (?:((\\\\)*)\\), 后面不跟\\or {or /, (?![\\/{]),并且前面不跟反斜杠(?<!\\).

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是该非反斜杠字符后面的偶数(或零)个反斜杠。

于 2011-02-22T19:34:18.390 回答
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
    }
});
于 2011-02-22T20:15:21.457 回答
0

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

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

于 2011-02-22T19:08:08.263 回答