Regex R中的动态正则表达式

Regex R中的动态正则表达式,regex,r,Regex,R,只要before和before字符串没有正则表达式专用的字符,下面的代码就可以工作: 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, ')'), co

只要
before
before
字符串没有正则表达式专用的字符,下面的代码就可以工作:

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))
在Perl中,在之前,有一种方法可以完全做到这一点。如果单据上写的是正确的

返回EXPR的值,并将所有ASCII非“word”字符反斜杠。(也就是说,所有与/[A-Za-z_0-9]/不匹配的ASCII字符在返回的字符串中都将以反斜杠开头,而不考虑任何区域设置。)

然后,您可以通过执行以下操作来实现相同的目标:

quotemeta <- function(x) gsub("([^A-Za-z_0-9])", "\\\\\\1", x)
substr(tt, 2, nchar(tt)-1)
# [1] "he'l\\(lo)"

quotemetadnagirl,这样一个函数存在并且是
glob2rx

a <- "he'l(lo)"
tt <- glob2rx(a)
# [1] "^he'l\\(lo)$"

before <- 'Name of your Manager (note "self" if you are the Manager)'
tt <- glob2rx(before)
# [1] "^Name of your Manager \\(note \"self\" if you are the Manager)$"

使用
\Q..\E
环绕逐字记录子模式:

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

pattern <- sprintf('(?<=\\Q%s\\E).*?(?=\\Q%s\\E)', before, after)

完美的我想它不是一个核心函数,因为R通常不用于文本处理。在我发布答案之前,我看到了
glob2rx
。我不认为它是任务的函数,例如尝试
glob2rx(“.”)
。@flodel,我知道它的局限性。大多数时候,它对我有效。我在这里发帖的唯一原因是因为他的问题似乎与这个问题完全相同。。我被要求在这里发表我的评论作为回答。甚至更好!我不知道
\Q…。\E
。我可以看到它在很多地方派上了用场。这非常方便!如果您的正则表达式不需要
perl=TRUE
,则不需要
\Q..\E
才能工作。
substr(tt, 2, nchar(tt)-1)
# [1] "he'l\\(lo)"
# test data
before <- "A."
after <- ".Z"
x <- c("A.xyz.Z", "ABxyzYZ")

pattern <- sprintf('(?<=\\Q%s\\E).*?(?=\\Q%s\\E)', before, after)
> gregexpr(pattern, x, perl = TRUE) > 0
[1]  TRUE FALSE