正则表达式:最短的匹配没有发生

时间:2018-08-13 11:56:35

标签: r regex

我想从"/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/"

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

1 个答案:

答案 0 :(得分:4)

您的正则表达式匹配第一个/,然后匹配 any 0个或多个除换行符以外的其他字符,并且尽可能少,直到{{1 }},然后是除换行符以外的任何0个或多个字符,并尽可能少,直到最左边的-vs-

您需要“限制”第一个/至少以匹配除.以外的任何字符,并且您可以使用取反的方括号表示方法,例如:

/

请参见regex demo

详细信息

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

R测试:

/