你可以使用stringvariables实时创buildJavaScript正则expression式吗?

假设我想让以下重复使用:

function replace_foo(target, replacement) { return target.replace("string_to_replace",replacement); } 

我可能会这样做:

 function replace_foo(target, string_to_replace, replacement) { return target.replace(string_to_replace,replacement); } 

使用string文字很容易。 但是如果我想用正则expression式来处理一些更棘手的事情呢? 例如,说我想replace一切, string_to_replace 。 本能地,我会尝试通过做如下的事情来扩展上面的内容:

 function replace_foo(target, string_to_replace, replacement) { return target.replace(/^string_to_replace/,replacement); } 

这似乎并不奏效。 我的猜测是,它认为string_to_replace是一个string文字,而不是一个表示string的variables。 是否有可能使用stringvariables在飞行中创buildJavaScript正则expression式? 如果可能的话,这样的事情会很棒:

 function replace_foo(target, string_to_replace, replacement) { var regex = "/^" + string_to_replace + "/"; return target.replace(regex,replacement); } 

new RegExp(string, flags) flagsgi 。 所以

 'GODzilla'.replace( new RegExp('god', 'i'), '' ) 

评估

 zilla 

string文字很容易。

不是真的! 该示例仅replacestring_to_replace第一个匹配string_to_replace 。 更常见的情况是你想要replace所有的事件,在这种情况下,你必须把string转换成全局的( /.../g 。 您可以使用new RegExp构造函数从string中执行此操作:

 new RegExp(string_to_replace, 'g') 

这样做的问题是,string中的任何正则expression式都会以特殊的方式运行,而不是普通的字符。 你将不得不反斜杠 – 逃脱他们来解决这个问题。 不幸的是,没有内置的函数可以为你做这个,所以你可以使用下面的函数:

 function escapeRegExp(s) { return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&') } 

还要注意,当你在replace()使用RegExp时,replacestring现在也有一个特殊字符$ 。 如果你想要在你的replace文本中有一个字面值$ ,这也必须逃脱!

 function escapeSubstitute(s) { return s.replace(/\$/g, '$$$$'); } 

(四$因为这本身就是一个replacestring!)

现在您可以使用RegExp实现全局stringreplace:

 function replace_foo(target, string_to_replace, replacement) { var relit= escapeRegExp(string_to_replace); var sub= escapeSubstitute(replacement); var re= new RegExp(relit, 'g'); return target.replace(re, sub); } 

太痛苦了 幸运的是,如果所有你想要做的是一个直接的stringreplace没有额外的正则expression式部分,有一个更快的方法:

 s.split(string_to_replace).join(replacement) 

…就这样。 这是一个普遍理解的习惯用语。

说我想要取代一切,但string_to_replace

这是什么意思,你想要replace所有不参与匹配string的文本? replace^当然不是这样,因为^意味着一个string的开始标记,而不是否定。 ^只是[]字符组中的否定。 也有消极lookaheads (?!...) ,但在JScript中有问题,所以你通常应该避免它。

你可以尝试匹配'一切到'string,并使用一个函数来放弃匹配string之间的任何空的拉伸:

 var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')') return target.replace(re, function(match) { return match[1]===''? match[2] : replacement+match[2]; }); 

在这里,再次分裂可能会更简单:

 var parts= target.split(string_to_match); for (var i= parts.length; i-->0;) if (parts[i]!=='') parts[i]= replacement; return parts.join(string_to_match); 

正如其他人所说,使用new RegExp(pattern, flags)来做到这一点。 值得注意的是,你将传递string到这个构造函数中,所以每个反斜杠都必须被转义。 例如,如果你想要你的正则expression式匹配一个反斜杠,你需要说new RegExp('\\\\') ,而正则expression式只需要是/\\/ 。 根据你打算如何使用它,你应该谨慎的将用户input传递给这样一个没有足够的预处理(转义特殊字符等)的function。如果没有这个,你的用户可能会得到一些非常意外的结果。

是的你可以。

https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions

 function replace_foo(target, string_to_replace, replacement) { var regex = new RegExp("^" + string_to_replace); return target.replace(regex, replacement); } 

我认为我有很好的例子,突出显示文本string(它发现不看寄存器,但突出显示使用寄存器)

 function getHighlightedText(basicString, filterString) { if ((basicString === "") || (basicString === null) || (filterString === "") || (filterString === null)) return basicString; return basicString.replace(new RegExp(filterString.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\\\$&'), 'gi'), function(match) {return "<mark>"+match+"</mark>"}); } 

http://jsfiddle.net/cdbzL/1258/