首页 > 解决方案 > 正则表达式:最短匹配没有发生

问题描述

我想从中"/arsenal-vs-man-city/"提取"/sports/football/arsenal-vs-man-city/stats/"。我不明白为什么我正在尝试的东西不起作用。我不知道为什么我的起步很长,因为我?-vs-. 这是代表:

library(stringr)
str_extract_all("/sports/football/arsenal-vs-man-city/stats/", "/.*?-vs-.*?/")
#> [[1]]
#> [1] "/sports/football/arsenal-vs-man-city/"

我想知道这样做的正确方法是什么,以及为什么我的方法是错误的。

标签: rregex

解决方案


您的正则表达式匹配第一个/,然后是除换行符之外的任何0 个或多个字符,尽可能少,直到第一个(最左边)出现,-vs-然后是除换行符之外的任何 0 个或多个字符,尽可能少,直到最近的最左边/

您需要.至少“限制”第一个以匹配任何 char but /,并且您可以使用否定括号表达式方法,例如:

/[^/]*-vs-[^/]*/

查看正则表达式演示

细节

  • /- 一个/
  • [^/]*- 0 个或更多字符/
  • -vs-- 文字子串
  • [^/]* - 0 个或更多字符/
  • / - 一个/

R测试:

> library(stringr)
> str_extract_all("/sports/football/arsenal-vs-man-city/stats/", "/[^/]*-vs-[^/]*/")
[[1]]
[1] "/arsenal-vs-man-city/"

推荐阅读