RegExp:使用反向引用时的结果不同

Jie*_*eng 1 javascript regex

http://jsfiddle.net/aEEUN/

为什么当我使用反向引用而没有反向反射时,我会得到不同的结果?

var str = "Hello World\nHello          ";
document.write("Without backreference: <br />");
var match = str.match(/\S(?![\s\S]*\S)/);
document.write("- match.index: " + match.index + "<br />"); // index is 16 

document.write("With backreference: <br />");
var match = str.match(/(\S)(?![\s\S]*\1)/);
document.write("- match.index: " + match.index); // index is 6
Run Code Online (Sandbox Code Playgroud)

Gum*_*mbo 5

不同之处在于您将两个字符约束为完全相同.

在第一个正则表达式中,不得有以下任何非空格字符:

/\S(?![\s\S]*\S)/
Run Code Online (Sandbox Code Playgroud)

这基本上意味着匹配任何其他非空白字符后面没有的非空格字符.这就是为什么它匹配o后面只有空格的最后一个:

"Hello World\nHello          "
                  ^ no other non-whitespace character following
Run Code Online (Sandbox Code Playgroud)

但是在第二个正则表达式中,之前必须匹配的特定字符:

/(\S)(?![\s\S]*\1)/
Run Code Online (Sandbox Code Playgroud)

这基本上意味着匹配任何不会在字符串的其余部分中再次出现的非空白字符.这W就是匹配的原因,因为它是第一次出现后不再出现的第一个非空白字符:

"Hello World\nHello          "
       ^ no other “W” following
Run Code Online (Sandbox Code Playgroud)

这就是为什么它被称为反向引用:您引用先前匹配的字符串.