JavaScript字符串替换为正则表达式和函数作为参数

时间:2010-11-06 16:53:29

标签: javascript string replace

我在阅读有关此功能的书籍中似乎得到了相互矛盾的建议。 我想知道是否有人可以澄清。 例如,Nicholas Zakas声明函数参数具有格式的签名 function(match,pos,originalText)(P139:适用于Web开发人员的Pro JavaScript第2版:Wrox)

他继续说当正则表达式有一个匹配时,函数会传递三个参数(如上所述)。当有多个捕获组时,每个匹配的字符串作为参数传入,最后两个位置是position和originalText ...

然后我们来到Doug Crockfords,JavaScript:The Good Parts。 (P90): 他再次将语法规定为字符串(searcValue,replaceValue) searchValue可以是一个正则表达式 - 很棒的匹配.. 如果replaceValue是一个函数,第一个参数是匹配的文本,第二个参数是捕获组1,第三个是捕获组2,依此类推。 这里有一个明显的区别。 (即无位置参数)

我还在查看Pro JavaScript设计模式(APress P152)中的一个示例,该示例启动了整个交叉引用过程。这些人(Ross Harmes / Dustin Diaz)用两个名为a&的参数非常无益地指定了replaceValue函数。湾 但它倾向于强化Doug Crockford描述的概念。

有人可以确认尼古拉斯扎卡斯的描述是否确实是一个有效的选择吗?

2 个答案:

答案 0 :(得分:8)

Zakas是正确的,倒数第二个和最后一个参数是posoriginalText。来自ECMA-262 3rd5th版本(第15.5.4.11节):

  

如果replaceValue是一个函数,那么对于每个匹配的子字符串,使用以下 m + 3参数调用该函数。参数1是匹配的子字符串。如果searchValue是正则表达式,则下一个 m 参数是 MatchResult 中的所有捕获(参见15.10.2.1)。参数 m + 2是匹配发生的字符串中的偏移量,参数 m + 3是string

请注意String.prototype.replace是ECMA-262第3版的新功能。用于JavaScript的JScript和MDC文档的MSDN文档都符合此规范。

答案 1 :(得分:4)

ECMAScript规范有:

String.prototype.replace (searchValue, replaceValue)
  

如果searchValue是正则表达式([[Class]]属性为“RegExp”的对象),请执行以下操作:if searchValue。 global为false,然后搜索正则表达式searchValue的第一个匹配项的字符串。如果searchValue.global为true,则搜索正则表达式searchValue的所有匹配项的字符串。以与String.prototype.match相同的方式进行搜索,包括searchValue的更新。 lastIndex的。设m是searchValue中左侧捕获括号的数量(15.10.2.1中指定的NCapturingParens)。

     

如果searchValue不是正则表达式,则让searchString为ToString(searchValue)并搜索第一次出现searchString的字符串。设m为0。

     

如果replaceValue是一个函数,那么对于每个匹配的子字符串,使用以下m + 3参数调用该函数。参数1是匹配的子字符串。如果searchValue是正则表达式,则下一个m参数是MatchResult中的所有捕获(参见15.10.2.1)。参数m + 2是匹配发生的字符串中的偏移量,参数m + 3是字符串。结果是从原始输入派生的字符串值,方法是将每个匹配的子字符串替换为函数调用的相应返回值,如果需要,将转换为字符串。

这有点令人困惑,但我认为Zakas是对的。