如何取 URL 中第一个单独的问号(?) 位置
新版 Arale 通过 nginx 服务支持使用双问号的访问方式:
https://www.example.com/??module.js
访问 https://www.example.com/module.js
通过正则的正向预搜索有办法获得第一个单问号的位置么?
会匹配双问号的第 2 个问号:
https://www.example.com/??modu.js
^
1var path = function(uri){
2 var idx = uri.indexOf(";jsessionid=");
3 if(idx >= 0){return uri.substr(0, idx);}
4
5 do{
6 idx = uri.indexOf("?", idx);
7 if(idx < 0){break;}
8 if("?" == uri.charAt(idx+1)){
9 idx += 2;
10 }else{
11 break;
12 }
13 }while(idx >= 0);
14
15 return idx < 0 ? uri : uri.substr(0, idx);
16};
目前是通过循环方式计算的,无心比较遍历和正则之间无优劣,
纯粹对于正则的实现很有兴趣 :)
答案一:
1var path = function(uri){
2 return uri.replace(/;jsessionid=.*$/, "")
3 .replace(/^(.*?[^?])\?[^?]/, "$1");
4};
答案二:
上面用了两个相同规则的分组,这里可以减少到一个分组
"asdfadf??a?a".replace(/([^\s])\?\1/, '$1*$1'); // "asdfadf??a*a"
但是这种做法对于问号(?)在字符串首尾时没有办法匹配
1var temp= "12345???89?asdf".search(/(?:[^?]|^)\?(?!\?)/);
2var index = temp ? temp + 1 : temp; // index的就想要的索引值
Tags: JavaScript, RegExp
Published on 2011-06-22