我正在尝试从r中的路径提取文件名。像
这样的字符串fetch('https://localhost:44360/api/Articles/')
.then(response => response.json())
.then(data => {
this.setState({ articles: data, loading: false });
});
我要提取125514_45147_55144
我正在使用以下表达式:
someurl.com/vp/125514_45147_55144.jpg?_nc25244
虽然有效,但也去除了下划线:
sub(".*vp/(.*?)/.*", "\\1", input)
我不知道如何保留下划线
答案 0 :(得分:5)
删除基本名称的点及其后的所有内容:
sub("\\..*", "", basename(x))
## [1] "125514_45147_55144"
如果文件名中可能包含点,则使用这种稍微复杂一点的模式:
sub("(.*)\\..*", "\\1", basename(x))
## [1] "125514_45147_55144"
答案 1 :(得分:2)
我建议将其修复为
sub(".*/vp/([^/?]*?)\\.[^/?.]*(?:\\?.*)?$", "\\1", input)
请参见regex demo
详细信息
.*
-尽可能多0个字符/vp/
-文字子字符串([^/?]*?)
-第1组(其捕获的值由替换模式中的\1
引用):除/
和?
以外的任何0+字符,少至可能\\.
-一个点[^/?.]*
-除.
,?
和/
之外的0+个字符(?:\\?.*)?
-可选的子字符串,匹配?
,然后匹配尽可能多的0+个字符$
-字符串的结尾。使用regmatches
/ regexec
,模式变得更加清晰:
x <- "someurl.com/vp/125514_45147_55144.jpg?_nc25244"
regmatches(x,regexec("/vp/([^/?]*)\\.",x))[[1]][2]
## => [1] "125514_45147_55144"
请参见R demo
答案 2 :(得分:2)
stringr
替代
library( stringr )
str_match( "someurl.com/vp/125514_45147_55144.jpg?_nc25244", "^.*/(.*?)\\..*$" )[[2]]
#[1] "125514_45147_55144"
答案 3 :(得分:2)
受到@ G.Grothendieck答案的启发,这是一个使用dirname
,basename
和chartr
的无正则表达式的解决方案
x = 'someurl.com/vp/125514_45147_55144.jpg?_nc25244'
dirname(chartr(x = basename(x), ".", "/"))
# [1] "125514_45147_55144"
假设文件名中没有点。