繁体   English   中英

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

[英]JavaScript String Replace with regular expression and function as arguments

我在阅读有关此功能的书籍中似乎得到了相互矛盾的建议。 我想知道是否有人可以澄清。 例如,Nicholas Zakas声明函数参数具有格式函数的签名(match,pos,originalText)(P139:Pro JavaScript for Web Developers 2nd ed: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&b的参数非常无益地指定了replaceValue函数。 但它倾向于强化Doug Crockford描述的概念。

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

Zakas是正确的,倒数第二个和最后一个参数是posoriginalText 从ECMA-262 第3版第5版(第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文档都符合此规范。

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是字符串。 结果是通过将每个匹配的子字符串替换为函数调用的相应返回值而从原始输入派生的字符串值,如果需要,将其转换为字符串。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM