【问题标题】:Regex to replace single backslashes, excluding those followed by certain chars正则表达式替换单个反斜杠,不包括后跟某些字符的反斜杠
【发布时间】:2011-07-02 05:30:38
【问题描述】:

我有一个正则表达式,如果后面没有以下字符之一,它会从字符串中删除任何反斜杠:\ / 或}。

应该转这个字符串:

foo\bar\\batz\/hi

进入这个:

foobar\\batz\/hi

但问题是它正在处理每个反斜杠。所以它遵循规则,因为它删除了第一个反斜杠,并忽略了第二个反斜杠,因为它后面跟着另一个反斜杠。但是当它到达第三个时,它会删除它,因为它后面没有另一个。

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

但生成的字符串如下所示:foobar\batz\/hi

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

请帮忙! :)

编辑

抱歉,我应该解释一下 - 我使用的是 javascript,所以我认为我不能做负面的后视...

【问题讨论】:

  • 它适用于我:"foo\\bar\\\\batz\\/hi".replace(/\\(?!\\|\/|\})/g,"")。你只需要确保正确地转义字符串。
  • 字符串会发生什么:foo\\\barfoo\\\\\bar(反斜杠的数量不均匀)。我的回答假设您只想替换最后一个反斜杠(“不均匀”的反斜杠)。我还包括了一个与 JS 兼容的(没有后视)。
  • 啊,太好了!似乎工作:D谢谢!

标签: javascript regex replace backslash


【解决方案1】:

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

您可以使用以下正则表达式来做到这一点:

(?<!\\)(?:((\\\\)*)\\)(?![\\/{])

并将其替换为:

$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 '{'

用简单的英文写成:

匹配奇数个反斜杠(?:((\\\\)*)\\),后面不跟\\{/(?![\\/{])前面没有反斜杠@987654331 @。

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 是该非反斜杠字符后面的偶数(或零)个反斜杠。

【讨论】:

  • 太好了,谢谢。这有效: str.replace(/([^\])((\\\)*)\(?![\\/{])/g,"$1$2");我显然需要做更多的测试,但我累了!会给你一个绿色的勾:)编辑它正在删除评论中的一些反斜杠,但我用你的代码字节对字节!
  • @WastedSpace,不客气。您可以在 cmets 中使用反引号包装代码:[^\\]
  • 这个问题被标记为“javascript”,但接受的答案是用 Java 编写的,包括 JavaScript 不支持的look-behinds。因此,这个答案对于这个问题是不正确的.
【解决方案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
    }
});

【讨论】:

    【解决方案3】:

    你需要像你一样的前瞻,也需要后瞻,以确保你不会删除第二个斜杠(它后面显然没有特殊字符。试试这个:

    (?&lt;![\\])[\\](?![\\\/\}]) 作为你的正则表达式

    【讨论】:

    • 当第一个转义反斜杠后跟一个反斜杠时失败:baz\\\foo。什么都不会被删除,而最后一个反斜杠应该被删除。
    • 可能是正确的。然而,OP 的规范是不应删除任何跟在 \ / 或 } 后面的斜线。因此 \\, \\\\, \\\\, \\\\\\, \\\\\\ 都是有效的。如果你说的确实是想要的,OP应该在问题中更清楚地说明。
    • 对不起,应该提到我正在使用 javascript。我不认为我可以使用消极的lookbehinds...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    相关资源
    最近更新 更多