JS语言精粹中有如下代码:
'(555)666-1212'.replace(/\((\d{3})\)/g, '$1-');
// 555-666-1212
按照定义$1-
是替换捕获组1的内容为捕获组1-, 那么问题来了: 捕获组1不应该是555
而不是(555)
? 为什么两个括号也被替换掉了?
'(555)666-1212'.match(/\((\d{3})\)/)
//["(555)", "555"]
JS语言精粹中有如下代码:
'(555)666-1212'.replace(/\((\d{3})\)/g, '$1-');
// 555-666-1212
按照定义$1-
是替换捕获组1的内容为捕获组1-, 那么问题来了: 捕获组1不应该是555
而不是(555)
? 为什么两个括号也被替换掉了?
'(555)666-1212'.match(/\((\d{3})\)/)
//["(555)", "555"]
一步一步来:
String.prototype.replace
是会搜寻整个正则表达式/22(d{2})22/
的内容并用'replaced!'
字符串来替换, 不管正则内有没有分组;'$1'
则指代捕获组1的内容, 在这里就是'33'
. 因此整个正则所匹配的内容会被替换成为'$1'
的内容.具体到这里,
/((d{3}))/g
匹配的是'(555)'
, 捕获组1捕获到的则是'555'
, 因此'(555)'
会被替换为'555' + '-'
.