11

如何使用超过 9 个反向引用的 gsub?我希望下面示例中的输出为“e、g、i、j、o”。

> test <- "abcdefghijklmnop"
> gsub("(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)(\\w)", "\\5, \\7, \\9, \\10, \\15", test, perl = TRUE)
[1] "e, g, i, a0, a5"
4

6 回答 6

9

请参阅R 语言的正则表达式

您可以在替换文本中使用反向引用来重新插入与捕获组匹配\1文本。整体匹配没有替换文本标记。将整个正则表达式放在捕获组中,然后使用.\9\1

但是使用 PCRE,您应该能够使用命名组。所以尝试分组命名和作为反向引用。(?P<name>regex)(?P=name)

于 2009-09-09T17:37:14.560 回答
4

改用strsplit

test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]
于 2009-09-09T19:30:46.800 回答
3

我的理解是 \10 我们会理解为反向引用 0 后跟数字 1。我认为 9 是最大值。

于 2009-09-09T17:24:11.003 回答
2

stringi包中的stri_replace_*_regex函数没有这样的限制:

library("stringi")
stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$11$12")
## [1] "jakl"

如果您想使用 1 跟随第一个捕获组,请使用例如

stri_replace_all_regex("abcdefghijkl", "(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)(.)", "$10$1$1\\1$12")
## [1] "jaa1l"
于 2014-06-13T13:35:38.000 回答
1

根据这个网站,反向引用 \10 到 \99 适用于某些语言,但不是大多数。

那些被报告工作的是

于 2009-09-09T17:33:10.030 回答
0

这种对 9 个反向引用的限制特定于sub()andgsub()函数,而不是函数 likegrep()等。在 R 中支持超过 9 个反向引用意味着使用 PCRE 正则表达式(即perl=TRUE参数);然而,即使有这个选项,sub() 和 gsub() 函数也不支持它。

R 文档在这一点上是明确的:见 ?regexp

There can be more than 9 backreferences (but the replacement in sub can
only refer to the first 9).

此外,使用命名捕获组来规避此限制的想法必然会失败,因为 sub() 函数不支持命名捕获组。

regexpr and gregexpr support ‘named capture’. If groups are named,
e.g., "(?<first>[A-Z][a-z]+)" then the positions of the matches are also
returned by name. (Named backreferences are not supported by sub.)
于 2015-10-25T17:23:38.293 回答