<script>
str = "ddWindows ddscript ddWindows ddWindows";
newstr = str.replace(/dd(?=script)/g,"mm");
document.write(newstr)
</script>结果是ddWindows mmscript ddWindows ddWindows 但换个位置又正常
为什么呢
str = "ddWindows ddscript ddWindows ddWindows";
newstr = str.replace(/dd(?=script)/g,"mm");
document.write(newstr)
</script>结果是ddWindows mmscript ddWindows ddWindows 但换个位置又正常
为什么呢
但在abcdefg这个字符串中 bcdefg却符合要求 为什么呢?
因为 bcdefg不是abc开头 因为它是bcd开头
也就是说abcdefg匹配后
就又从a开始匹配,即bcdefg?
而一般的正则由于.*应该是整个匹配了的吧就不会再进行匹配?
我理解的对不对呢说实话我一直看不懂哪句
找到一个匹配后,紧接匹配到的文字(而不包括预查中使用的字符)就开始对下一次匹配的搜索
是不是就是这个意思呢
str = "scriptdd";
newstr = str.replace(/(?=script)dd/g,"mm");
document.write(newstr)
</script>但这里明明就有scriptdd
为什么没有替换呢
scriptdd
这不就是了吗
但没有转换啊
运用前瞻可以告诉正则表达式运算器向前看一些字符而不移动其位置,包括正向前瞻和负向前瞻,正向前瞻检查的是接下来出现的是不是某个特定字符集,而负向前瞻则是检查接下来的不应该出现的特定字符集。创建正向前瞻要将模式放在(?=和)之间。创建负向前瞻要将模式放在(?!和)之间。::::正向前瞻检查的是{ { 接下来 } }出现的是不是某个特定字符集,而负向前瞻则是检查{ { 接下来的 } }不应该出现的特定字符集。(?=script)必须在某个东西的后面,那怕是空格就是说
newstr = str.replace(/ (?=script)/g,"mm");
alert(newstr);如上 ,注意/ (?=script)/这前面有个空格,这就吧控格替换成了mm
那就是说(?=)(?!)只能是放在最后咯<script>
str = "Windowsdd scriptdd Windowsdd Windowsdd";
newstr = str.replace(/(?!script)dd/g,"mm");
document.write(newstr)
</script>
但为什么没有报错呢
也确实是替换了
虽然不是预期那样
如果按gzdiablo的说法这里也就说得通了
但?=的时候就又说不通到底谁说的才对啊
/(?=script)/代表的是紧跟着是script的那个空字符
所以所有script前面都会添加一个mm
/(?=script)dd/之所以没有匹配是因为在匹配了(?=script)之后
是从script中的s开始匹配dd所以永远也不会匹配到
如果换成/(?=script)sc/那么所有script中的sc都会替换成mm即mmript想了一天终于明白了
在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串
是什么意思了
比如:123456789,要取出12345,要更新的是批量的
如
Windows (?!95|98|NT|2000) 匹配之外,反向
Windows (?=95|98|NT|2000) 匹配之内,正向它只能匹配后面的,不能是前面的,如:
(?!my|your) Friend
(?=my|your) Friend
这样就不能匹配了。-----它违背了"预测先行搜索"的游戏规则.你看了下面这个结果应该就会明白了
str = "Windowsdd scriptdd Windowsdd sdfasdfasdd Windowsdd";
newstr = str.replace(/(?=Windows)/g,"mm");
--------------------------
mmWindowsdd scriptdd mmWindowsdd sdfasdfasdd mmWindowsdd
-----
搞错了。 应该是说比较的。
如:
Windows (?!95|98|NT|2000)匹配的 是"Windows "
比较的 是"95|98|NT|2000"