我有一个正则表达式,如果没有跟随其中一个字符,则从字符串中删除任何反斜杠:\ /或}。
它应该变成这个字符串:
foo\bar\\batz\/hi
进入这个:
foobar\\batz\/hi
但问题在于它正在处理每个反斜杠。因此它遵循规则,因为它删除了第一个反斜杠,并忽略第二个反斜杠,因为它后跟另一个反斜杠。但当它到达第3个时,它会删除它,因为它不会被另一个跟随。
我当前的代码如下所示:str.replace(/\\(?!\\|\/|\})/g,"")
但结果字符串如下所示:foobar\batz\/hi
如何让它跳过第3个反斜杠?或者是做某种明确的否定搜索的案例&替换类型的东西?例如。替换'\',但不要替换'\\','\ /'或'\}'?
请帮忙! :)
修改 的
对不起,我应该解释一下 - 我正在使用javascript,所以我认为我不能做负面的看法......
答案 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)
你需要一个前瞻,就像你拥有的一样,也需要一个外观,以确保你不会删除第二个斜线(后面显然没有特殊字符。试试这个:
(?<![\\])[\\](?![\\\/\}])
作为你的正则表达式