正则表达式匹配最后一个点之前的内容

3

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

我希望正则表达式可以在file1中匹配example,并且可以在file2中匹配example.ffe.2f2。有什么建议或者我做错了什么吗?该表达式在regex101.com上运行良好,所以我知道模式是正确的。


1
\ not one slash I think - Jeremy Kahan
在 R 中 "" 是转义字符。如果要表示反斜杠本身,则需要使用 "\"。 - Adam Spannbauer
2
还要使用regexpr(pattern, files, perl = TRUE),因为您正在使用超出基本分组类型的内容。 - Nathan Werth
@AdamSpannbauer 这样修复了未识别的转义错误,但现在实际的 regexpr 行会抛出一个错误,说它是一个 无效的正则表达式 - Kyle Weise
@NathanWerth 哦,没错。谢谢 Nathan 和 Adam。 - Kyle Weise
你也可以尝试使用 gsub('[.][^.]+$', '', files) - rawr
1个回答

5
一个 (?=\.) 是一个正向 lookahead。TRE regex flavor(如果未指定perl=TRUE,则默认使用)不支持前瞻模式。您必须使用PCRE regex引擎来处理这些模式。
为了正确转义 .,需要在R字符串字面量中将 \ 符号加倍。但是,您可以通过将 . 放入括号表达式 / 字符类 - [.] 中来避免这种情况。
您可以使用以下代码:
file1 <- "example.txt"
file2 <- "example.ffe.2f2.csv"
files <- c(file1,file2)
regmatches(files, regexpr(".*(?=[.])", files, perl=TRUE))
## => [1] "example"         "example.ffe.2f2"

请看在线R演示

注意,也可以使用同样的方法得到相同的结果。

tools::file_path_sans_ext(files)

获取没有扩展名的文件名(演示)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接