正则问题,求解析。
看了过客的
http://blog.csdn.net/lxcnn/article/details/4304651
http://blog.csdn.net/lxcnn/article/details/4304754
介绍。
感觉很迷糊
举个例子
<script type="text/javascript">
var str = 'aa<p>one</p>bb<div>two</div>cc';
var re = /<\/?(?!p)[^>]+>/g;
var re2 = /<\/?((?!p)[^>])+>/g;
str.replace(re, function($){
console.log($)
})
/*
</p>
<div>
</div>
*/
console.log('-----')
str.replace(re2, function($){
console.log($)
})
/*
<div>
</div>
*/
</script>
re 为什么会匹配 </p>,没弄明白
/?(?!p),这里不是定义了/的右边不能是p么,怎么没起作用
(?!p)[^>]+
((?!p)[^>]
)+
有无括号,为什么区别那么大,是不是 ((?!p)[^>]) 被视作一个整体,而 (?!p)[^>] 是分开的?
希望高手解析下.
------解决方案--------------------1、因为前面有“/?”可以忽略,实际是这样命中:【<】【/p>】
再排除一个“/”可以达到你的预期:/<\/?(?!p
------解决方案--------------------\/)[^>]+>/g
2、如你理解的一样,差别主要是后面的“+”导致
(?!p)【[^>]+】
【((?!p)[^>])+】
------解决方案--------------------假设:
var str="</p>",
re = /<\/?(?!p)[^>]+>/g,
re2 = /<\/?((?!p)[^>])+>/g;
这样可以简化问题。
对re中 \/? 表示/可有可无,先匹配有则遇见了(?!p)则失败。再进行没有/的匹配,这样串中的/就匹配了(?!p),再加上后面的匹配,所以就成功了。
对 re2 \/?部分一样的。先匹配/,很快失败了。不匹配/的时候,(这里要注意(!?p)只判断匹配否,不消耗串的字符),串中的/就先与(?!p)比较通过,再与[^>]比较通过;接下来是串中的p,p遇到(!?p)能过不了,而且p也不是> 也结束不了匹配;最后导致这个正则跟这个串匹配不了。
------解决方案--------------------第一次匹配失败了,还要匹配当/没有的时候
<得到控制权,位置0,匹配
<成功,权转给
/?(第一次,记录位置1),位置1,优先匹配
/,与
/匹配成功,权转给
(?!p),位置2,右边不能为
p,匹配失败,返回位置1,
/?忽略优先匹配,与
/(此时位置1的右边是/,不是p),匹配成功...