Ecmascript:15.5.4.11
String.prototype.replace (searchValue, replaceValue)
首先根据以下步骤设定string
:
以this
值作为参数调用CheckObjectCoercible
。
令string
为 以this
值作为为参数调用ToString
的结果。
如果searchValue
是一个正则表达式([[Class]]
内部属性是 "RegExp"
的对象),按照如下执行:如果searchValue.global
是false
,则搜索string
,找出匹配正则表达式searchValue
的第一个子字符串。如果searchValue.global
是true
,则搜索string
,找出匹配正则表达式searchValue
的所有子字符串。搜索的做法与String.prototype.match
相同,包括对searchValue.lastIndex
的更新。令m
为searchValue
的左捕获括号的个数(使用 15.10.2.1 指定的NcapturingParens
)。
如果searchValue
不是正则表达式,令searchString
为ToString(searchValue)
,并搜索string
,找出第一个出现的searchString
的子字符串。令m
为0
。
如果replaceValue
是函数,则对每个匹配的子字符串,以m + 3
个参数调用这个函数。第一个参数是匹配的子字符串。如果searchValue
是正则表达式,接下来m
个参数是MatchResult
(见 15.10.2.1)里的所有捕获值。第m + 2
个参数是发生的匹配在 string 里的偏移量,第m + 3
个参数是string
。结果是将输入的原字符串里的每个匹配子字符串替换为相应函数调用的返回值(必要的情况下转换为字符串)得到的字符串。
否则,令newstring
表示replaceValue
转换为字符串的结果。结果是将输入的原字符串里的每个匹配/捕获子字符串替换为 -- 将newstring
里的字符替换为表 22 指定的替代文本得到的字符串 -- 得到的字符串。替换这些$
是由左到右进行的,并且一旦执行了这样的替换,新替换的文本不受进一步替换。例如 ,"$1,$2".replace(/(\$(\d))/g, "$$1-$1$2")
返回"$1-$11,$1-$22"
。newstring
里的一个$
,如果不符合以下任何格式,就保持原状。
注:
这里,第一次匹配了"$1"
,第一个捕获为"$1"
,第二个捕获为" 1"
,将这次匹配替换成了$1-$11
。
第二次匹配了"$2"
,第一个捕获为"$2"
,第二个捕获为" 2"
,将这次匹配替换成了$1-$22
。
替代文本符号替换
字符编码值
表示
字符
替代文本
$$
$
$&
匹配到的子字符串
$`
( 译注:'\u0060')string
中匹配到的子字符串之前部分。
$'
( 译注:'\u0027') string
中匹配到的子字符串之后部分。
$n
第 n 个捕获结果,n
是范围在 1 到 9 的单个数字,并且紧接着$n
后面的不是十进制数字。如果n≤m
且第n
个捕获结果是undefined
,就用空字符串代替。如果n>m
,结果是实现定义的。
$nn
第nn
个捕获结果,nn
是范围在 01 到 99 的十进制两位数。如果nn≤m
且第nn
个捕获结果是undefined
,就用空字符串代替。如果nn>m
,结果是实现定义的。
注:
一次匹配中有多个捕获组。$&
表示整个匹配,$1,$2,...
表示各个捕获。
replace
函数被有意设计成通用的;它不要求它的this
值是字符串对象。因此,他可以当做方法转移到其他类型对象。