【问题标题】:Escape single backslash inbetween non-backslash characters only仅在非反斜杠字符之间转义单个反斜杠
【发布时间】:2016-12-19 02:50:56
【问题描述】:

我有一些输入来自网页,我将在其他地方重新显示和提交。当前的问题是,在将输入提交到其他地方之前,我想将夹在非反斜杠字符之间的所有 single 反斜杠加倍。

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

这个字符串应该什么都没有"\\get\\\nothing\\\\"

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

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

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

我不关心是否存在任何双、三或四反斜杠,它们可以单独放置。

【问题讨论】:

  • domain\name\previousBackslashesUnwanted 上的正则表达式操作应该返回什么?这对我来说不清楚
  • 测试字符串 "domain\name\\previousBackslashesUnwanted" ,我只想获得域名和名称之间的单个 \。给定测试字符串 \\\\get\\\\nothing,所需的正则表达式不应返回任何内容。我拥有的最接近的正则表达式是 [\w][\\](?!\\) (我在这里转义时遇到了麻烦,但中间方括号和圆括号中应该只有 2 个反斜杠)返回第一个字符在单数反斜杠之前。 regexpal.com
  • 你想对比赛做什么?换成别的东西?拆分字符串?还是为用户突出显示?
  • 我想用双反斜杠替换夹在非反斜杠之间的单反斜杠

标签: javascript angularjs regex string escaping


【解决方案1】:

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

它会只使用替换,因为您可以使用$& 插入匹配的子字符串,请参阅:

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

【讨论】:

    【解决方案2】:

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

    \\(.)
    

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

    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);

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

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

    【讨论】:

    • 抱歉不清楚,我已经更新了我的问题中的示例测试字符串。我当前的解决方案不会触发三次反斜杠。我不需要处理任何奇数个连续的 > 1 的反斜杠。我只希望在由非反斜杠字符包围的单个反斜杠上触发正则表达式。我可以使用当前的正则表达式处理更少的匹配项。
    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 2013-11-10
    • 2014-12-04
    • 1970-01-01
    • 2010-12-14
    • 2020-02-01
    • 2015-05-19
    相关资源
    最近更新 更多