您好,匿名用户
随意问技术百科期待您的加入

求一段js正则解释

0 投票
url = (url.match(/^([^#]+)/)||[])[1];

url 是取的form中的action,如果form中的action不存在,则去取window.location.href
这段正则是匹配什么?

(url.match(正则)||[])[1]

如果url匹配上了.则是什么?如果没匹配上[][1]怎么解释 ?

用户头像 提问 2014年 6月7日 @ Hades 上等兵 (152 威望)
分享到:

1个回答

0 投票
 
最佳答案

这里涉及 match 方法的一个细节,当正则表达式设置了全局检索标识 g,若在字符串中匹配到,返回是一个包含了所有匹配项的数组:

'baz'.match(/./g); // ["b", "a", "z"]

如果没有这个全局检索标识,只会检索第一个匹配,但是返回的仍旧是个数组,数组第一项是匹配结果,其后的数组项则是正则中各个分组表达式(你看到正则表达式中的括号)的匹配结果

var a = 'baz'.match(/^b(a)(z)/); // ["baz", "a", "z"]

这样你访问 a[1] 就是第一个分组表达式 (a) 的匹配结果,类似的a[2] 就是第二个分组表达式 (z) 的结果,以此类推,a[n] 对应第n个分组表达式匹配的值。

然后,回到你的问题,这个表达式匹配:从起始位置开始,除'#'外的所有字符

这里没有设置全局检索标识,所以只会检索第一个匹配,然后就是分组表达式的匹配,数组第二项就是(/[^#]+/) 这个分组表达式的匹配结果

如果没有匹配到,match 返回 null[][1] 如你所见,undefined

可能有同学会纳闷为什是这样的实现?

如果你知道replace方法中基于分组替换的实现:

'baz'.replace(/(b)(a)(z)/, '$1-$2-$3'); // "b-a-z"

其中,$n 分别对应第n个分组表达式的匹配结果,用法和 match 非常相似

用户头像 回复 2014年 6月7日 @ Lux 上等兵 (267 威望)
选中 2013年 9月7日 @Hades
提一个问题:

相关问题

0 投票
1 回复 23 阅读
用户头像 提问 2012年 12月1日 @ Aquarius 上等兵 (283 威望)
0 投票
1 回复 18 阅读
用户头像 提问 2014年 2月15日 @ hadoop 上等兵 (109 威望)
0 投票
1 回复 30 阅读
用户头像 提问 2012年 12月1日 @ Aquarius 上等兵 (283 威望)
0 投票
1 回复 30 阅读
用户头像 提问 2012年 12月1日 @ Soraka 上等兵 (319 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...