仅在非反斜杠字符之间转义单个反斜杠

时间:2016-12-19 02:50:56

标签: javascript angularjs regex string escaping

我在网页上有一些输入,我将重新显示并提交到其他地方。目前的问题是,我希望在将输入提交到别处之前,将所有单个反斜杠加倍,这些反斜杠夹在非反斜杠字符之间。

测试字符串"domain\name\\nonSingle\\\WontBe\\\\Returned",我想只获得域和名称之间的第一个单反斜杠。

此字符串不应为"\\get\\\nothing\\\\"

我最接近的当前模式[\w][\\](?!\\)但是这将从我列出的第一个测试字符串中获得"\n"。我想使用lookbehind为正则表达式,但javascript对我正在使用的版本没有这样的东西。这是我在http://www.regexpal.com/

上测试我的正则表达式的网站

目前我无效地使用这个正则表达式[\w][\\](?!\\)来提取所有单反斜杠夹在非反斜杠字符和它们之前的字符(我不想要)之间然后替换它使用相同的字符串加上一个反斜杠。

例如,给定domain\name\\bl\\\ah我的当前正则表达式[\w][\\]\(?!\\)将返回"n\"。这导致我的代码不得不进行一些额外的处理,而不仅仅是使用替换。

我不关心任何双重,三重或四重反斜杠,它们可以单独使用。

2 个答案:

答案 0 :(得分:0)

匹配转义的最简单方法是匹配所有转义字符。

\\(.)

然后在替换中,根据捕获的内容决定如何处理它。



var s = "domain\\name\\\\backslashesInDoubleBackslashesWontBeReturned";
console.log('input:', s);

var r = s.replace(/\\(.)/g, function (match, capture1) {
    return capture1 === '\\' ? match : '$' + capture1;
});
console.log('result:', r);




实际匹配非转义反斜杠的最接近的是

((?:^|[^\\])(?:\\\\)*)\\(?!\\)

它将匹配奇数个反斜杠,并将除最后一个之外的所有反射捕获到捕获组1中。



var re = /((?:^|[^\\])(?:\\\\)*)\\(?!\\)/g;
var s = "domain\\name\\\\escapedBackslashes\\\\\\test";

var parts = s.split(re);
console.dir(parts);

var cleaned = [];
for (var i = 1; i < parts.length; i += 2)
{
    cleaned.push(parts[i-1] + parts[i]);
}
cleaned.push(parts[parts.length - 1]);
console.dir(cleaned);
&#13;
&#13;
&#13;

偶数(从零开始计算)项目将是不匹配的文本。奇数项目将是捕获的文本。

每个捕获的文本都应被视为前一文本的一部分。

答案 1 :(得分:0)

  

例如,给定domain\name\\bl\\\ah,我当前的正则表达式[\w][\\]\(?!\\)将返回"n\"。这导致我的代码不得不做一些额外的处理,而不仅仅是使用replace。

它将执行仅使用replace ,因为您可以使用$&插入匹配的子字符串,请参见:

console.log(String.raw`domain\name\\bl\\\ah`.replace(/\w\\(?!\\)/g, "$&\\"))