正则表达式在捕获组中保持尾随斜杠

时间:2015-03-01 22:02:06

标签: javascript regex node.js

所以,我尝试制作一个小的Regex表达式来获取请求的URL,减去开始的斜杠。

一个小问题,尾随斜杠不会总是存在,例如,如果用户请求"/test/example/",他们也可以请求"/test/example"。所以我尝试制作一个方法来处理:

req.url.match(/^(?:\/)(.+)(?:[\/])?$/i)[1]

虽然,如果我请求像"/test/example/"这样的路径,它会保留尾部斜杠,并在捕获组中返回"test/example/" ...?基本上我想避免的。 (所以,它正在做的就是删除起始斜杠)

现在,我尝试删除$符号旁边的?。但是这只会在请求"/test/example"(没有尾部斜杠)时导致错误,因为[1]将为空。

我在regex101上做了一个例子,you can view here。正如你所看到的,捕获组包含结尾的斜杠,即使在我的表达中,我还是告诉它不要这样做。

TL; DR:Regex仍然捕获尾随斜杠,即使我不想这样做(并且请记住尾随斜杠不会一直存在)。


为了实现这一点,我希望正则表达式能够做到这一点:

"/test/example/""test/example"

"/test/example""test/example"

(因此,删除起始和尾部斜杠,但尾部斜杠是可选的)

3 个答案:

答案 0 :(得分:0)

你需要让正则表达式变得不那么贪婪。添加2 ? s:

^(?:\/)?(.*?)(?:[\/])?$

请参阅updated regex here

答案 1 :(得分:0)

使用此模式并替换为任何内容

^\/|\/$  

Demo

答案 2 :(得分:0)

Javascript的正则表达式引擎并不是最强的。

我有一个像这样的问题,我最后分两步执行正则表达式,以提高可读性和可预测性。

var matches = req.url.match(/^(?:\/)(.+)(?:[\/])?$/i)

if(matches.length){
    var my_url = matches[1].replace(/(^\/|\/$)/g,'')    //  Removes start and ending slashes
}else{
    var my_url = 'something_else'
}