R正则表达式匹配直到最后一个点

时间:2017-06-22 13:16:25

标签: r regex

我正在尝试在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 "".*(?=\."

我希望正则表达式与example中的file1example.ffe.2f2中的file2匹配。我做错的任何建议/事情?它在regex101.com上正常工作,所以我知道模式是正确的。

1 个答案:

答案 0 :(得分:3)

(?=\.)肯定lookahead 。 TRE正则表达式风格(如果未指定perl=TRUE,则默认使用)不支持前瞻。您必须使用PCRE正则表达式引擎来处理此类模式。

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

您可以使用以下代码:

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)。