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 に答える