r - 正则表达式:最短匹配没有发生
问题描述
我想从中"/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/"
我想知道这样做的正确方法是什么,以及为什么我的方法是错误的。
解决方案
您的正则表达式匹配第一个/
,然后是除换行符之外的任何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/"
推荐阅读
- json - 在 Firebase 中复制数据的正确方法是什么?
- ios - iOS Swift 使用 AVFoundation 从shoutcast 或icecast 流式传输音频
- memory - 32位CPU内存
- r - 在特定条件下使用 renderText Shiny
- css - div 的高度和宽度与 Chrome 的 DevTools 中的屏幕尺寸不一致
- javascript - 选择器的变换值
- python - 获取轮廓最高点的坐标
- firebase - 在 Firestore 中的对象数组中查询子项
- angular - Angular 9 tslint 没有输出重命名
- java - Rest 响应中带有 javax.validation.constraints.Future 注释的自定义消息