R中的动态正则表达式

dna*_*irl 10 regex r

以下代码只要工作,before并且after字符串没有正则表达式特有的字符:

before <- 'Name of your Manager (note "self" if you are the Manager)' #parentheses cause problem in regex
after  <- 'CURRENT FOCUS'

pattern <- paste0(c('(?<=', before, ').*?(?=', after, ')'), collapse='')
ex <- regmatches(x, gregexpr(pattern, x, perl=TRUE))
Run Code Online (Sandbox Code Playgroud)

R有一个函数来转义在正则表达式中使用的字符串吗?

flo*_*del 7

在Perl中,有http://perldoc.perl.org/functions/quotemeta.html就是这么做的.如果说文件是正确的话

返回EXPR的值,并将所有ASCII非"字"字符反斜杠.(也就是说,所有不匹配的ASCII字符/ [A-Za-z_0-9] /将在返回的字符串中以反斜杠开头,而不管任何语言环境设置.)

然后你可以做到这一点:

quotemeta <- function(x) gsub("([^A-Za-z_0-9])", "\\\\\\1", x)
Run Code Online (Sandbox Code Playgroud)

你的模式应该是:

pattern <- paste0(c('(?<=', quotemeta(before), ').*?(?=', quotemeta(after), ')'),
                  collapse='')
Run Code Online (Sandbox Code Playgroud)

快速健全检查:

a <- "he'l(lo)"
grepl(a, a)
# [1] FALSE
grepl(quotemeta(a), a)
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)


G. *_*eck 5

使用\Q...\E包围逐字子模式:

# test data
before <- "A."
after <- ".Z"
x <- c("A.xyz.Z", "ABxyzYZ")

pattern <- sprintf('(?<=\\Q%s\\E).*?(?=\\Q%s\\E)', before, after)
Run Code Online (Sandbox Code Playgroud)

这使:

> gregexpr(pattern, x, perl = TRUE) > 0
[1]  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)