0

我在MDN 文档中遇到了这个关于在字符串上使用 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 不同?

感谢您的评论

4

1 回答 1

2

实际上,$1is "J"$2is"ohn"和 the" 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匹配一个word,但?使它成为可选的,所以就像(.*?)(.)在 中捕获一个字母一样$1(\w?)正在做同样的事情。第二个捕获,(\w+)然后只能扩展到单词的末尾,尽管+, 因为\w不匹配 whitespace \s

于 2013-06-21T23:50:01.437 回答