【问题标题】:Remove part of string before last "/"删除最后一个“/”之前的部分字符串
【发布时间】:2016-07-28 11:24:08
【问题描述】:

我想删除 /query .. 之前的所有内容,例如

我对正则表达式一无所知,所以这样做对我来说很困难

注意:参考应该是/query,因为下面提到的链接可能有一些不同的模式,比如-www.abcd.wsd/asd/asdcd/asrr/query=xyz

www.html.com/query=abcd

应该变成

 query = abcd

【问题讨论】:

  • 使用sub("^.*/(query.*)$", "\\1", s)。或者如果query 被限制在/ 内:sub("^.*/(query[^/]*).*$", "\\1", s)

标签: regex r


【解决方案1】:

提取出现在最后一个/ 之后的query 并且后跟/ 以外的字符的通用正则表达式解决方案是

s <- c("www.abcd.wsd/asd/asdcd/asrr/query=xyz","www.html.com/query=abcd","www.cmpnt.com/query=fgh/noquery=dd")
sub("^.*/(query[^/]*).*$", "\\1", s)
## => "query=xyz"  "query=abcd" "query=fgh"

this R demo

正则表达式是

^.*/(query[^/]*).*$

regex demo

详情

  • ^ - 字符串开头
  • .* - 尽可能多地匹配任何 0+ 个字符,直到最后一个
  • / - 文字正斜杠字符
  • (query[^/]*) - 捕获组 1 匹配 query 子字符串后跟除 / 以外的 0+ 个字符(请参阅 [^/]* 带有 * 量词的否定字符类)
  • .* - 零个或多个任意字符,最多
  • $ - 字符串结尾。

【讨论】:

    【解决方案2】:

    我们可以滥用 basename 函数,该函数旨在获取文件名,删除所有文件夹:

    basename("www.abcd.wsd/asd/asdcd/asrr/query=xyz")
    # [1] "query=xyz"
    
    basename("www.html.com/query=abcd")
    # [1] "query=abcd"
    

    请注意,当query 不在末尾时,这将失败:

    basename("www.html.com/query=abcd/xyz")
    # [1] "xyz"
    

    【讨论】:

    • @pankaj 对不起,我不明白你的问题。
    • 我真的不明白,我很抱歉,但请你让我明白这一点。这个函数在什么基础上返回最后一个字符?是斜线(/)吗?
    • @pankaj 是的,它返回最后一个斜线 / 之后的所有内容。
    【解决方案3】:

    另一种选择是:

    sub('.*/query', '/query', 'www.html.com/query=abcd')
    

    即,用“/query”替换“直到并包括 [最后一个] /query 的所有字符”。

    【讨论】:

      【解决方案4】:
      string<-c('www.abcd.wsd/asd/asdcd/asrr/query=xyz','www.html.com/query=abcd')
      gsub('.*\\/([^/]+)$','\\1',string)
      #[1] "query=xyz"  "query=abcd"
      

      【讨论】:

        猜你喜欢
        • 2015-06-21
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2023-03-21
        • 2012-05-13
        • 2012-06-07
        相关资源
        最近更新 更多