我在MDN documentation中遇到了关于在字符串上使用replace方法的示例。
这是那里引用的例子
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
print(newstr);//Smith,John
我将正则表达式更改为以下内容并进行了测试。
var re = /(\w?)(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$1, $1");
newstr;//J, ohn Smith
var newstr1=str.replace(re,"$2, $1");
newstr1;//ohn, J Smith.
在此示例中, $ 1必须为J
且$ 2必须为ohn Smith
。
当我为newstr1颠倒$ n的顺序时,它应该是'ohn Smith,J`。但事实并非如此。
是我对$ 1和$ 2(子串匹配正确)的理解以及为什么newstr1不同?
感谢您的评论
答案 0 :(得分:2)
实际上,$1
为"J"
,$2
为"ohn"
且" Smith"
无法匹配。
var re = /(\w?)(\w+)/,
str = "John Smith";
str.replace(re, function (match, $1, $2) {
console.log('match', match);
console.log('$1', $1);
console.log('$2', $2);
return ''; // leave only unmatched
});
/* match John
$1 J
$2 ohn
" Smith"
*/
因此,您的互换使用J
切换ohn
,为您提供newstr1
。
为什么会发生这种情况?因为\w
匹配字,但?
使其成为可选字段,所以就像(.*?)(.)
一样在$1
中抓取一个字母,(\w?)
也是这样做的。第二次捕获(\w+)
只能延伸到单词的末尾,会调用+
,因为\w
与空格\s
不匹配。