我正在尝试在 R 中使用这个正则表达式:
\?(?=([^'\\]*(\\.|'([^'\\]*\\.)*[^'\\]*'))*[^']*$)
我是这样逃避的:
\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)
我收到一个invalid regexp错误。
Regexpal 的正则表达式没有问题,我已经检查过 R 错误消息中解释的正则表达式与我在 Regex pal 中使用的完全相同,所以我有点不知所措。我不认为逃避是问题所在。
代码:
output <- sub("\\?(?=([^'\\\\]*(\\\\.|'([^'\\\\]*\\\\.)*[^'\\\\]*'))*[^']*$)", "!", "This is a test string?")
Run Code Online (Sandbox Code Playgroud)
R默认情况下使用(POSIX可移植操作系统接口)正则表达式标准(请参阅这些 SO 帖子 [ 1 , 2] 和 [买者自负:前面的砍刀级密度])。?regex
前向 ( (?=...))、后向 ( (?<=...)) 及其否定 ((?!...)和) 可能是特定(Perl兼容正则表达式(?<!...))形式的最显着的示例,它们与 不兼容。PCREPOSIX
Rperl可以通过激活选项来训练理解您的正则表达式TRUE;此选项在所有base正则表达式函数(gsub、grepl、regmatches等)中均可用:
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)
| 归档时间: |
|
| 查看次数: |
2610 次 |
| 最近记录: |