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

JavaScript字符串替换为正则表达式和函数作为参数,javascript,string,replace,Javascript,String,Replace,在我读的关于这个功能的书中,我似乎得到了相互矛盾的建议。 我想知道是否有人能澄清一下。 例如,Nicholas Zakas声明函数参数具有格式签名 函数(match、pos、originalText)(第139页:面向Web开发人员的Pro JavaScript第二版:Wrox) 他接着说,当正则表达式有一个匹配项时,函数将被传递三个参数(如上所述)。当有多个捕获组时,每个匹配的字符串都作为参数传入,最后两个位置是position和originalText 然后我们来看Doug Crockfor

在我读的关于这个功能的书中,我似乎得到了相互矛盾的建议。 我想知道是否有人能澄清一下。 例如,Nicholas Zakas声明函数参数具有格式签名 函数(match、pos、originalText)(第139页:面向Web开发人员的Pro JavaScript第二版:Wrox)

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

然后我们来看Doug Crockfords,JavaScript:好的部分。(第90页): 他将语法再次规定为字符串(searcValue,replaceValue) searchValue可以是正则表达式-非常匹配。。 如果replaceValue是一个函数,第一个参数是匹配的文本,第二个参数是捕获组1,第三个参数是捕获组2,依此类推。。 这里有一个明显的区别。(即无立场论点)

我还看到了Pro JavaScript设计模式(APress P152)中的一个示例,它启动了整个交叉引用过程。这些家伙(Ross Harmes/Dustin Diaz)用两个名为a和b的参数指定了replaceValue函数,这是毫无帮助的。 但它倾向于强化道格·克罗克福德(Doug Crockford)所描述的概念


有人能确认Nicholas Zakas的描述是否也是一个有效的选项吗?

Zakas是正确的,倒数第二个和最后一个参数是
pos
originalText
。根据ECMA-262及其版本(第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版中的新版本。JScript的MSDN文档和JavaScript的MDC文档都符合本规范


ECMAScript规范具有:

String.prototype.replace (searchValue, replaceValue)
如果searchValue是正则表达式(其[[Class]]属性为“RegExp”的对象),请执行以下操作:如果searchValue。“全局”为false,然后在字符串中搜索正则表达式searchValue的第一个匹配项。如果searchValue.global为true,则在字符串中搜索正则表达式searchValue的所有匹配项。以与String.prototype.match中相同的方式执行搜索,包括更新searchValue。最后的索引。设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是字符串。结果是通过将每个匹配的子字符串替换为函数调用的相应返回值,从原始输入派生出一个字符串值,如果需要,可以转换为字符串


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

感谢您的回复。你有到规范的链接吗?对于rev 3 html。官方网站是链接和感谢。特别是Moziila一号非常棒。