我正在尝试在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
中的file1
和example.ffe.2f2
中的file2
匹配。我做错的任何建议/事情?它在regex101.com上正常工作,所以我知道模式是正确的。
答案 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)。