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 ...
你需要注意一个反斜杠,然后是一个反斜杠.或者更好:连续反斜杠的数量不均匀.在这种情况下,您需要保持偶数个反斜杠完整,并且只替换最后一个(如果没有后跟一个/或{).
您可以使用以下正则表达式执行此操作:
(?<!\\)(?:((\\\\)*)\\)(?![\\/{])
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后面的偶数(或零)反斜杠数.
| 归档时间: |
|
| 查看次数: |
7519 次 |
| 最近记录: |