如何取 URL 中第一个单独的问号(?) 位置

新版 Arale 通过 nginx 服务支持使用双问号的访问方式:

https://www.example.com/??module.js

访问 https://www.example.com/module.js

通过正则的正向预搜索有办法获得第一个单问号的位置么?

1var r = /\?(?!\?)/;

会匹配双问号的第 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