日期:2014-05-16  浏览次数:20464 次

正则问题,求解析。
看了过客的
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),匹配成功...