使用正则表达式在javascript中的String.replace方法

时间:2013-06-21 23:46:36

标签: javascript string methods replace

我在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不同?

感谢您的评论

1 个答案:

答案 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不匹配。