R 中的正则表达式无效

Joh*_*tom 5 regex r

我正在尝试在 R 中使用这个正则表达式:

\?(?=([^'\\]*(\\.|'([^'\\]*\\.)*[^'\\]*'))*[^']*$)

我是这样逃避的:

\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)

我收到一个invalid regexp错误。

Regexpal 的正则表达式没有问题,我已经检查过 R 错误消息中解释的正则表达式与我在 Regex pal 中使用的完全相同,所以我有点不知所措。我不认为逃避是问题所在。

代码:

output <- sub("\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)", "!", "This is a test string?")
Run Code Online (Sandbox Code Playgroud)

Mic*_*ico 7

R默认情况下使用POSIX移植操作系统接口)正则表达式标准(请参阅这些 SO 帖子 [ 1 , 2] 和 [买者自负前面的砍刀级密度])。?regex

前向 ( (?=...))、后向 ( (?<=...)) 及其否定 ((?!...)和) 可能是特定Perl兼容表达式(?<!...))形式的最显着的示例,它们与 不兼容。PCREPOSIX

Rperl可以通过激活选项来训练理解您的正则表达式TRUE;此选项在所有base正则表达式函数(gsubgreplregmatches等)中均可用:

output <- sub(
  "\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)",
  "!",
  "This is a test string?",
  perl = TRUE
)
Run Code Online (Sandbox Code Playgroud)

当然,对于具有原始字符串支持的 R>=4.0 来说,它看起来不那么令人生畏:

output <- sub(
  R"(\?(?=([^'\\]*(\\.|'([^'\\]*\\.)*[^'\\]*'))*[^']*$))",
  "!",
  "This is a test string?",
  perl = TRUE
)
Run Code Online (Sandbox Code Playgroud)