2011-10-06 54 views
1

希望逃避所有出现的“。”。和 “:” 方括号内,无法替换()使用子匹配

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

尝试不同的排列上replace,例如,

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

,但没有喜悦。


这两个答案正确,更多。

首先,纯模式匹配,完成工作,非常简洁。在我看来,它更好地回答了陈述的问题。

第二个,调用replace带有一个函数arg,稍微有点强壮,并且提供了更多的灵活性。在我的代码中使用这种方法,因为它可以轻松处理一些特殊情况。

回答

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. 

向前确保在我们看到的点/冒号后面的下一个括号是闭括号。

+0

很好的解释。让我感到惊讶的是,你并不担心领导支架(因为它必须在那里) - 使匹配更加复杂。 –

+0

这不需要打开和关闭大括号。因此,它不适用于:[[ab:1.2:ef] ='12.3]'或'ab:1.2:ef] ='12.3'。 – jfriend00

+0

对,这就是为什么我写了括号必须正确平衡(JavaScript不支持后向断言)。我应该补充一点,这也涉及到字符串中的括号,注释等。 –

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/

+0

哇!从来没有在'replace'中看到过用作参数的函数 - 非常酷。比以前使用的'match'循环更优雅。谢谢! –

+0

关于你对我的回答的评论,你的正则表达式也会出现字符串中不平衡括号的问题,比如'[ab:1.2] ='[12.3'; [cd:3.4] = '34.5]''。只要分隔符不平衡和/或内部字符串/注释,正则表达式开始失败,并且您需要解析器来完成这种工作。 –

+0

是的,在完成工作和展示大铁之间有一条细线。也就是说,你是否知道将一个(有点)任意字符串转换为波兰式树结构的实用程序? –