为什么这些返回null
:
var str="Is this all abc bbb c is";
var patt1=/is(?=bbb)/;
var str="Is this all abc bbb c is";
var patt1=/is(?=bbb)/;
var str="Is this all there is";
var patt1=/is(?=all)/; // <------ (?=all) vs (? =all)
但这会返回is
:
var str="Is this all there is";
var patt1=/is(?= all)/;
答案 0 :(得分:4)
(?=...)
是正则表达式“预见”功能,所以这是你的正则表达式的含义:
/is(?=bbb)/ //look for isbbb and return is
/is(?=all)/ //look for isall and return is
这两个字符串中都不存在,因此您没有匹配。
答案 1 :(得分:1)
我们来看看你的正则表达式/is(?=bbb)/
。想象一下表达式开头有一点caret(插入符号是字母之间的闪烁线,表示文本光标所在的位置 - 它位于指向的字母后面):
is(?=bbb)
^
我们在你的字符串中寻找一个小的i
。我们在单词this
中找到一个。插入符号转移:
is(?=bbb)
^
下一个字母是s
吗?确实是。插入符号再次转移:
is(?=bbb)
^
现在发生了一些有趣的事情。现在我们检查下一个字母是否为b
。然而,即使我们发现它,我们也不会推进插入符号。
如果我们匹配子表达式bbb
,那么插入符号会在匹配的括号之后前进到字符(但是子表达式匹配的文本不包含在匹配的字符串中):
id(?=bbb)
^
很遗憾,is
后面的bbb
字符串中没有null
。这就是你获得{{1}}的原因。