【问题标题】:Regex keeps trailing slash in capture group正则表达式在捕获组中保持斜杠
【发布时间】:2015-03-01 22:02:05
【问题描述】:

所以,我尝试制作一个小的正则表达式来获取请求的 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"

(所以,去掉开头和结尾的斜线,但结尾的斜线是可选的)

【问题讨论】:

标签: javascript regex node.js


【解决方案1】:

您需要使正则表达式不那么贪婪。加2个?s:

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

updated regex here

【讨论】:

  • 太棒了。我早该知道。出于某种原因,我一直在想,如果我使用惰性运算符,它将匹配 "/test/example""test"... 但后来我才想起我使用的是字符串结尾 $ 运算符。
  • 至于你添加的第一个?,没关系,因为它总是存在于NodeJS req.url中。
  • req.url 是否曾经像 http://domain.com/test/example/ 那样完全写过?如果是这样,这将无法正确匹配。只是试图考虑任何可能的问题。如果情况并非如此,那么你不需要匹配任何东西,你可以做req.url.replace(/(^\/|\/$)/g,'')
  • 不,它只提供请求的路径...就像在我的示例中一样:"/test/example"。但无论你请求什么路径,总会有一个起始"/",所以第一组的? 并不重要。
  • @JamenMarz:我将第一个斜杠设为可选,以满足“/test/example/”到“test/example”的要求。
【解决方案2】:

使用这个模式并什么都不替换

^\/|\/$  

Demo

【讨论】:

    【解决方案3】:

    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'
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多