JavaScript 替换/正则表达式
Posted
技术标签:
【中文标题】JavaScript 替换/正则表达式【英文标题】:JavaScript replace/regex 【发布时间】:2010-11-12 20:21:46 【问题描述】:给定这个函数:
function Repeater(template)
var repeater =
markup: template,
replace: function(pattern, value)
this.markup = this.markup.replace(pattern, value);
;
return repeater;
;
如何使this.markup.replace()
全局替换?这就是问题所在。如果我这样使用它:
alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);
警报的值为“foobar $TEST_ONE”。
如果我将 Repeater
更改为以下内容,那么 Chrome 中将不会替换任何内容:
function Repeater(template)
var repeater =
markup: template,
replace: function(pattern, value)
this.markup = this.markup.replace(new RegExp(pattern, "gm"), value);
;
return repeater;
;
...警报是$TEST_ONE $TEST_ONE
。
【问题讨论】:
【参考方案1】:您需要对任何正则表达式字符进行双重转义(一次用于字符串中的斜线,一次用于正则表达式):
"$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")
否则,它会查找行尾和“TESTONE”(它永远找不到)。
出于这个原因,我个人不太喜欢使用字符串构建正则表达式。所需的逃逸程度可能会导致您喝酒。我敢肯定,其他人在编写正则表达式时会有不同的感受,并且喜欢喝酒。
【讨论】:
但是 replace() 将正则表达式作为变量接收。 @Chris - 我认为使用/pattern/
或new RegExp("pattern")
不会有什么不同。
@seth,您的答案有效,但它没有为 OP 的代码提供解决方案。我如何调用 OP 的代码?【参考方案2】:
在模式解释方面,以下形式没有区别:
/pattern/
new RegExp("pattern")
如果您想使用replace
方法替换文字字符串,我认为您可以将字符串而不是正则表达式传递给replace
。
否则,您必须先转义模式中的任何正则表达式特殊字符 - 可能像这样:
function reEscape(s)
return s.replace(/([.*+?^$|()\[\]])/mg, "\\$1");
// ...
var re = new RegExp(reEscape(pattern), "mg");
this.markup = this.markup.replace(re, value);
【讨论】:
以前不知道,/pattern/ 和 new RegExp("pattern") 是一样的。真的有帮助! 有什么理由不使用白名单而不是黑名单?例如:s.replace(/(\W)/g,'\\$1') 列出的第一个表格更好。最好避免使用 new 关键字。 说正则表达式文字(/regex/)与RegExp(“regex”)相同是不准确的。在正则表达式文字中,反斜线 ('\') 本身不需要转义 ('\\') 以使其成为正则表达式的一部分。此外,可以在解析脚本时而不是每次执行函数时编译正则表达式文字。为了匹配反向固相线,您可以编写 /\\/ 或 RexExp("\\\\")。【参考方案3】:你的正则表达式模式应该有 g 修饰符:
var pattern = /[somepattern]+/g;
注意最后的 g。它告诉替换器进行全局替换。
你也不需要使用 RegExp 对象,你可以像上面那样构造你的模式。示例模式:
var pattern = /[0-9a-zA-Z]+/g;
一个模式总是被 / 包围 - 在最后 / 之后有修饰符,g 修饰符是全局的。
编辑:如果模式是一个变量,为什么重要?在你的情况下,它会像这样运行(注意模式仍然是一个变量):
var pattern = /[0-9a-zA-Z]+/g;
repeater.replace(pattern, "1234abc");
但是您需要将替换功能更改为:
this.markup = this.markup.replace(pattern, value);
【讨论】:
以上是关于JavaScript 替换/正则表达式的主要内容,如果未能解决你的问题,请参考以下文章