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

时间:2010-12-01 08:07:51

标签: 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

2 个答案:

答案 0 :(得分:5)

不同之处在于您将两个字符限制为完全相同。

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

/\S(?![\s\S]*\S)/

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

"Hello World\nHello          "
                  ^ no other non-whitespace character following

但是在第二个正则表达式中,之前匹配的特定字符不得出现:

/(\S)(?![\s\S]*\1)/

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

"Hello World\nHello          "
       ^ no other “W” following

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

答案 1 :(得分:0)

这是一些奇怪的正则表达式。角色类[\s\S]匹配一切不是吗?空间还是非空间?确切地说不确定,但后一个示例中的\1必须引用它在开始时所做的相同字符(而不仅仅是任何非空格)...这会给它一个不同的结果。