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

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

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

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

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

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

会匹配双问号的第 2 个问号:

https://www.example.com/??modu.js
                         ^
1
2
var path = function(uri){
    var idx = uri.indexOf(";jsessionid=");
    if(idx >= 0){return uri.substr(0, idx);}

    do{
        idx = uri.indexOf("?", idx);
        if(idx < 0){break;}
        if("?" == uri.charAt(idx+1)){
            idx += 2;
        }else{
            break;
        }
    }while(idx >= 0);

    return idx < 0 ? uri : uri.substr(0, idx);
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

目前是通过循环方式计算的,无心比较遍历和正则之间无优劣, 纯粹对于正则的实现很有兴趣 :)

答案一:

var path = function(uri){
    return uri.replace(/;jsessionid=.*$/, "")
        .replace(/^(.*?[^?])\?[^?]/, "$1");
};
1
2
3
4

答案二:

上面用了两个相同规则的分组,这里可以减少到一个分组

"asdfadf??a?a".replace(/([^\s])\?\1/, '$1*$1'); // "asdfadf??a*a"
1

但是这种做法对于问号(?)在字符串首尾时没有办法匹配

var temp= "12345???89?asdf".search(/(?:[^?]|^)\?(?!\?)/);
var index = temp ? temp + 1 : temp; // index的就想要的索引值
1
2
Help
[count]gg 跳转到第 [count] 行,默认第 1 行。
[count]G 跳转到第 [count] 行,默认最后一行。
[count]j 向下跳转 [count] 行,默认跳转一行。
[count]k 向上跳转 [count] 行,默认跳转一行。
/ 开始搜索。按 <Esc> 退出。
gh 跳转到首页。
gb 跳转到博客首页。
gw 跳转到 Wiki 首页。
gt 跳转到我的 Twitter Profile 页。
gp 跳转到我的 Github Profile 页。
? 打开帮助。按 <Esc> 退出。