正则表达式问题。

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

"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值获取到,但是第一种为何不行呢。

阅读 2.9k
2 个回答
?=n

先来理解这个表达式

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

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

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

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

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

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

我更新一个例子
图片描述
括号里面的东西并没有使指针往后走一个

图片描述

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进