2017-06-22 105 views
1

我试图创建在R.我想在这里如图所示的模式正则表达式的模式,[R正则表达式匹配,直到最后一个点

file1 <- "example.txt" 
file2 <- "example.ffe.2f2.csv" 
files <- c(file1,file2) 

#pattern that matches everything up to, but not including last . 

pattern <- ".*(?=\.)" 
m <- regexpr(pattern, files) 

但是我上的图案线得到一个错误说

Error: '\.' is an unrecognized escape in character string starting "".*(?=\." 

我想正则表达式匹配的file1exampleexample.ffe.2f2file2。任何建议/我做错的事情?它在regex101.com上正常工作,所以我知道该模式是正确的。

+1

\\不是一个斜杠我认为 –

+0

“\”是R.中的转义字符,您需要使用“\\”作为文字反斜杠。 –

+2

也使用'regexpr(pattern,files,perl = TRUE)',因为您使用的是超越基本的分组类型。 –

回答

3

A (?=\.)正数lookahead。 TRE正则表达式(如果未指定perl=TRUE,则默认使用)不支持预览。您必须使用PCRE正则表达式引擎来处理这种模式。

为了正确地转义.,使用文字\,必须在R字符串文字中将符号\加倍。但是,您可以通过将.放入括号表达式/字符类[.]中来避免这种情况。

您可以使用下面的代码:

file1 <- "example.txt" 
file2 <- "example.ffe.2f2.csv" 
files <- c(file1,file2) 
regmatches(files, regexpr(".*(?=[.])", files, perl=TRUE)) 
## => [1] "example"   "example.ffe.2f2" 

online R demo

需要注意的是同样的结果可以用

tools::file_path_sans_ext(files) 

是获取文件名没有扩展名(demo)获得。

相关问题