在javascript中,不能使用子匹配替换()

时间:2011-10-06 06:11:49

标签: javascript regex

希望逃避所有出现的“。”和方括号内的“:”

[ab:1.2:ef]='12.3' => [ab\:1\.2\:ef]='12.3'

replace上尝试了各种排列,例如,

str.replace( /(\[.*)(\.|:)(.*\])/g, '\1\\\2\3' );

但没有快乐。


两个答案都正确无误。

第一个是纯粹的模式匹配,完成工作并且非常简洁。在我看来,它更好地回答了所陈述的问题。

第二个,使用函数arg调用replace,它更加强大,并且提供了更大的灵活性。在我使用这种方法的代码中,因为它可以轻松处理几个特殊情况。

2 个答案:

答案 0 :(得分:2)

假设括号总是正确平衡(即使在字符串或注释中)并且永​​远不能嵌套或转义,您可以使用lookahead assertions在单个正则表达式中解决此问题:

result = subject.replace(/([:.])(?=[^[\]]*\])/g, "\\$1");

作为评论的正则表达式:

([:.])    # Match and remember a dot/colon,
(?=       # only if it is followed by:
 [^[\]]*  # any number of characters excluding brackets,
 \]       # followed by a closing bracket.
)         # End of lookahead assertion.

前瞻确保我们正在查看的点/冒号之后的下一个括号是一个结束括号。

答案 1 :(得分:1)

我只知道如何使用替换功能:

var test = "[ab:1.2:ef]='12.3'";

var out = test.replace(/\[.*?\]/g, function(str) {
    return(str.replace(/\.|:/g, "\\$&"));
});

// out is [ab\:1\.2\:ef]='12.3'

在此处查看此行动:http://jsfiddle.net/jfriend00/ZHVjW/