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

Was*_*ace 6 javascript regex replace backslash

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

它应该变成这个字符串:

foo\bar\\batz\/hi
Run Code Online (Sandbox Code Playgroud)

进入:

foobar\\batz\/hi
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

请帮忙!:)

编辑

对不起,我应该解释一下 - 我使用的是javascript,所以我不认为我可以做负面的lookbehinds ...

Bar*_*ers 6

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

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

(?<!\\)(?:((\\\\)*)\\)(?![\\/{])
Run Code Online (Sandbox Code Playgroud)

并替换为:

$1
Run Code Online (Sandbox Code Playgroud)

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

一个简短的解释:

(?<!\\)          # 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 '{'
Run Code Online (Sandbox Code Playgroud)

简单的英文版本如下:

匹配奇数背斜线的,(?:((\\\\)*)\\)而不是随后\\{/,(?![\\/{]),不是由反斜杠(?<!\\).

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

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

将打印:

baz\\\foo\bar\\batz\/hi
baz\\foobar\\batz\/hi
Run Code Online (Sandbox Code Playgroud)

编辑

一个不需要后视的解决方案看起来像:

([^\\])((\\\\)*)\\(?![\\/{])
Run Code Online (Sandbox Code Playgroud)

并被替换为:

$1$2
Run Code Online (Sandbox Code Playgroud)

其中$1是开头时的非反斜杠char,并且$2是非反斜杠char后面的偶数(或零)反斜杠数.