2011-06-09 56 views
8

我想使用一个字符串来执行全局正则表达式,但它可能有正则表达式字符。在构建正则表达式之前,用字符串中的所有正则表达式字符逃脱的最佳方法是什么?在RegExp构建之前清理字符串的正则表达式字符?

基本上我可能有这样的事情;

var test = 'test.'; 
var regex = new RegExp(test, 'ig'); 

我需要'测试'。成为'测试'。所以它不会以意想不到的方式行事。

+0

与我几个月前问过的问题类似!我从来没有真正得到答案,但也许你会... http://stackoverflow.com/questions/3614440/replicate-the-functionality-of-javas-pattern-quote-in-a-javascript-regexp – MatrixFrog 2011-06-09 22:55:18

回答

9
new RegExp(test.replace(/[#-.]|[[-^]|[?|{}]/g, '\\$&')); 

或者干脆:

new RegExp(test.replace(/[#-}]/g, '\\$&')); 

后者将最终逃脱了很多比它应该更多,但它不会伤害任何东西。

+0

您忘记了/ g全局标志,以取代所有的发生(我试图编辑您的帖子,但它告诉我改变必须至少6个字符) – youurayy 2012-09-24 16:38:03

+0

@ypocat - danke :) – 2012-09-24 21:25:06

+0

我有一些问题与第二个(正则表达式不匹配的东西,它应该由于某种原因),但第一个工程太棒了! – 2014-12-30 17:13:46

3

这将与他们的转义版本替换所有特殊的RegExp字符:

test = test.replace(/[\\\.\+\*\?\^\$\[\]\(\)\{\}\/\'\#\:\!\=\|]/ig, "\\$&"); 
+0

但一些这些角色只在某些情况下才是特殊的,不是吗?这是否会造成问题? – MatrixFrog 2011-06-09 22:59:23

+0

在其他情况下,转义字符不会损害RegExp匹配字符串,它最终会变得不必要。 – mVChr 2011-06-09 23:00:12

+1

无需转义'#','/','''或':'。你也需要'-'和',',并且你不需要在你所处的上下文中逃避大部分这些字符。它可以简单地变成'/ [ - \\。,_ * +?^ $ [ \](){}!= |] /' – 2011-06-09 23:11:03

相关问题