JavaScriptreplace/正则expression式
鉴于这个function:
function Repeater(template) { var repeater = { markup: template, replace: function(pattern, value) { this.markup = this.markup.replace(pattern, value); } }; return repeater; };
我如何使this.markup.replace()
全局replace? 这是问题。 如果我这样使用它:
alert(new Repeater("$TEST_ONE $TEST_ONE").replace("$TEST_ONE", "foobar").markup);
警报的值是“foobar $ TEST_ONE”。
如果我将Repeater
更改为以下内容,则Chrome中没有任何内容被replace:
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
。
您需要将任何RegExp字符(一次用于string中的斜杠,一次用于正则expression式)加倍转义:
"$TESTONE $TESTONE".replace( new RegExp("\\$TESTONE","gm"),"foo")
否则,它会查找行结束和“TESTONE”(它永远不会find)。
就个人而言,我不是build立正则expression式使用string的一个很大的粉丝。 需要逃跑的程度可能会导致你喝酒。 我相信其他人在写正则expression式时会觉得不一样,而且喜欢喝酒。
在模式解释方面,下列forms没有区别:
-
/pattern/
-
new RegExp("pattern")
如果你想用replace
方法replace一个文字string,我认为你可以传递一个string,而不是一个正则expression式来replace
。
否则,你将不得不逃脱模式中的任何正则expression式特殊字符 – 也许是这样的:
function reEscape(s) { return s.replace(/([.*+?^$|(){}\[\]])/mg, "\\$1"); } // ... var re = new RegExp(reEscape(pattern), "mg"); this.markup = this.markup.replace(re, value);
您的正则expression式模式应该有g修饰符:
var pattern = /[somepattern]+/g;
注意最后的g。 它告诉替代者做全球replace。
你也不需要使用RegExp对象,你可以像上面那样构build你的模式。 示例模式:
var pattern = /[0-9a-zA-Z]+/g;
一个模式总是围绕着/在任何一方 – 在最后的修饰符之后,g修饰符是全局的。
编辑:如果模式是一个variables,为什么它重要? 在你的情况下,它会像这样工作(注意模式仍然是一个variables):
var pattern = /[0-9a-zA-Z]+/g; repeater.replace(pattern, "1234abc");
但是你需要改变你的replacefunction:
this.markup = this.markup.replace(pattern, value);