gsub中有9个以上的反向引用()

时间:2009-09-09 17:19:45

标签: regex r gsub

如何使用gsub超过9个反向引用? 我希望下面例子中的输出为“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"

6 个答案:

答案 0 :(得分:8)

请参阅Regular Expressions with The R Language

  

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

但是使用PCRE,您应该可以使用named groups。因此,请尝试(?P< name > regex )进行分组命名和(?P= name )作为反向引用。

答案 1 :(得分:4)

改为使用strsplit

test <- "abcdefghijklmnop"
strsplit(test, "")[[1]][c(5, 7, 9, 10, 15)]

答案 2 :(得分:3)

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

答案 3 :(得分: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"

答案 4 :(得分:1)

根据this site,后引用\ 10到\ 99适用于某些语言,但不适用于大多数语言。

报告工作的是

答案 5 :(得分:0)

9个反向引用的限制特定于sub()gsub()函数,而不是grep()等函数。支持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.)