【问题标题】:JavaScript String Replace with regular expression and function as argumentsJavaScript 字符串替换为正则表达式和函数作为参数
【发布时间】:2011-05-06 01:43:36
【问题描述】:

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

他接着说,当正则表达式有一个匹配时,函数会传递三个参数(如上)。当有多个捕获组时,每个匹配的字符串作为参数传入,最后两个位置是位置和原始文本...

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

我还在查看 Pro JavaScript 设计模式 (APress P152) 中的一个示例,它启动了整个交叉引用过程。这些人(Ross Harmes/Dustin Diaz)用两个名为 a 和 b 的参数指定了 replaceValue 函数,这是毫无帮助的。 但它往往会强化 Doug Crockford 所描述的概念。

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

【问题讨论】:

    标签: javascript string replace


    【解决方案1】:

    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 版中的新增内容。 JScript 的 MSDN 文档和 JavaScript 的 MDC 文档都符合此规范。

    【讨论】:

    • 感谢您的链接和。 Moziila 特别棒。
    【解决方案2】:

    ECMAScript 规范有:

    String.prototype.replace (searchValue, replaceValue)
    

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

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

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

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

    【讨论】:

    猜你喜欢
    • 2020-03-13
    • 1970-01-01
    • 2015-09-09
    • 2018-12-27
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多