【问题标题】:Retain string up to second slash in regex?在正则表达式中将字符串保留到第二个斜杠?
【发布时间】:2020-11-05 16:53:53
【问题描述】:

我试图只保留第一部分字符(包括 - 和数字)之后但在正斜杠之前的字符串。

我有以下字符串:

x <- c('/youtube.com/videos/cats', '/google.com/images/dogs', 'bbc.com/movies')

/youtube.com/videos/cats
/google.com/images/dogs
bbc.com/movies

所以它看起来像这样

/youtube.com/
/google.com/
bbc.com/

作为参考,我使用的是 R 3.6

我尝试过积极的后视,我得到的最接近的是:^\/[^\/]*

任何帮助表示赞赏

所以在 bbc.com/movies 示例中 - 字符串不以正斜杠 / 开头,但我仍然希望能够在比赛期间保留 bbc.com 部分

【问题讨论】:

  • 你的尝试很接近,你可以做gsub('(^/?[^/]*/)|.', '\\1', x)

标签: r regex


【解决方案1】:

您可以在此处使用sub 仅执行单个正则表达式替换:

sub('^(/?[^/]*/).*', '\\1', x)

请参阅regex demo

详情

  • ^ - 字符串开头 -(/?[^/]*/) - 捕获组 1(替换模式中的 \1):可选的 /,然后是除 / 之外的 0 个或多个字符,然后是 /
  • .* - 任何零个或多个字符,尽可能多。

an R test online:

test <- c("/youtube.com/videos/cats", "/google.com/images/dogs", "bbc.com/movies")
sub('^(/?[^/]*/).*', '\\1', test)
# => [1] "/youtube.com/" "/google.com/"  "bbc.com/"   

【讨论】:

  • 是否也可以捕获到第二个分组?所以最多但包括第三个斜线(如果存在)?例如youtube.com/cats/dogs/beans 只会捕获 youtube.com/cats/dogs/?
  • @BeansOnToast ^(/?[^/]*(?:/[^/]*){2}).*,见demo
【解决方案2】:

第一个很棒的用户名。试试这个,您可以利用 str_extract 仅提取第一个匹配项这一事实。假设所有 url 都匹配 letters.letters 这个模式应该有效。如果其中有数字,请告诉我。

library(stringr) 
c("/youtube.com/videos/cats",
  "/google.com/images/dogs",
  "bbc.com/movies") %>% 
   str_extract(., "/?\\w+\\.\\w+/")

生产

"/youtube.com/" "/google.com/"  "bbc.com/"  

【讨论】:

    【解决方案3】:

    使用基础 R

    gsub('(\\/?.*\\.com\\/).*', '\\1', x)
    [1] "/youtube.com/" "/google.com/"  "bbc.com/"     
    

    【讨论】:

      【解决方案4】:

      另一种选择是使用 rebus 包:

      library(rebus)
      library(stringi)
      
      t <-  c("/youtube.com/videos/cats"," /google.com/images/dogs"," bbc.com/movie")
      
       pattern <- zero_or_more("/") %R% one_or_more(ALPHA) %R% DOT %R% one_or_more(ALPHA) %R% zero_or_more("/")
      
       stringi::stri_extract_first_regex(t, pattern) 
      
      [1] "/youtube.com/" "/google.com/"  "bbc.com/"
      

      【讨论】:

        猜你喜欢
        • 2015-11-18
        • 2015-07-14
        • 2012-01-10
        • 2019-08-26
        • 1970-01-01
        • 2015-02-06
        • 2012-11-22
        • 2017-04-20
        • 2022-07-12
        相关资源
        最近更新 更多