首页 > 正则表达式问题。

正则表达式问题。

这两个正则怎么不一个意思?

"http://baidu.com/?a=c#abc".replace(/.*(?=#[^\s]*)$/, '');
"http://baidu.com/?a=c#abc".replace(/.*(?=#[^\s]*)/, '');     // 预期的结果
"http://baidu.com/?a=c#abc".replace(/.*(?=#[^\s]*$)/, '');    // 也可以

我的想法是把hash值获取到,但是第一种为何不行呢。


?=n

先来理解这个表达式

匹配 任何其后 紧接 指定字符串 n 的 【字符串】。

最后匹配的字符串是不包括n的,而是n前面的那些。这个表达式有一个名称:向后匹配。[指针]在到达n时,会停下来,派一个哨兵往后去探情况,查看匹配是否成功,就是向后预言一样。但是,真正的[指针]是没有往后走的。你可以把(?=n)理解成[向后预言]而不是[真正的匹配]。

现在回头来看这个正则表达式

/.*(?=#[^\s]*)$/

重要的话说三遍
(?=#[^\s]*)只是预言,并没有真正匹配
(?=#[^\s]*)只是预言,并没有真正匹配
(?=#[^\s]*)只是预言,并没有真正匹配

它所表达的意思是:以 .* 结尾,并且预言它后面还有#[^\s]*。翻译过来就是,最后的字符串后面还有字符串。自相矛盾了。

我更新一个例子

括号里面的东西并没有使指针往后走一个


/.*(?=#[^\s]*)$/

这句表示匹配以#[^\s]*结尾的.*,但同时因为$,又需要.*结尾,所以就矛盾了。

【热门文章】
【热门文章】