10

只要字符串没有正则表达式的特殊字符,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))

R 是否具有转义要在正则表达式中使用的字符串的功能?

4

3 回答 3

7

在 Perl 中,有http://perldoc.perl.org/functions/quotemeta.html可以做到这一点。如果文档说的是正确的

返回带有反斜杠的所有 ASCII 非“单词”字符的 EXPR 的值。(也就是说,所有不匹配 /[A-Za-z_0-9]/ 的 ASCII 字符将在返回的字符串中以反斜杠开头,无论任何区域设置如何。)

那么您可以通过以下方式实现相同的目的:

quotemeta <- function(x) gsub("([^A-Za-z_0-9])", "\\\\\\1", x)

你的模式应该是:

pattern <- paste0(c('(?<=', quotemeta(before), ').*?(?=', quotemeta(after), ')'),
                  collapse='')

快速健全性检查:

a <- "he'l(lo)"
grepl(a, a)
# [1] FALSE
grepl(quotemeta(a), a)
# [1] TRUE
于 2013-04-25T18:50:38.810 回答
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)

这使:

> gregexpr(pattern, x, perl = TRUE) > 0
[1]  TRUE FALSE
于 2013-04-25T22:35:05.360 回答
1

dnagirl,这样的功能存在并且是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)$"

您可以通过执行以下操作从字符串中删除“^”和“$”:

substr(tt, 2, nchar(tt)-1)
# [1] "he'l\\(lo)"
于 2013-04-25T22:27:59.200 回答