希望逃避所有出现的“。”和方括号内的“:”
[ab:1.2:ef]='12.3' => [ab\:1\.2\:ef]='12.3'
在replace
上尝试了各种排列,例如,
str.replace( /(\[.*)(\.|:)(.*\])/g, '\1\\\2\3' );
但没有快乐。
两个答案都正确无误。
第一个是纯粹的模式匹配,完成工作并且非常简洁。在我看来,它更好地回答了所陈述的问题。
第二个,使用函数arg调用replace
,它更加强大,并且提供了更大的灵活性。在我使用这种方法的代码中,因为它可以轻松处理几个特殊情况。
答案 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/