Более 9 обратных ссылок в 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"

Ответ 1

Смотрите Регулярные выражения с языком R:

Вы можете использовать обратные ссылки \1 через \9 в заменяемом тексте для повторного ввода текста, сопоставленного named groups. Поэтому попробуйте (?P< name > regex ) для именования групп и (?P= name ) как обратную ссылку.

Ответ 2

Вместо этого используйте strsplit:

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

Ответ 3

Я понимал, что \10 мы понимаем как backreference 0, за которым следует цифра 1. Я думаю, что 9 - это максимум.

Ответ 4

Функции stri_replace_*_regex из пакета stringi не имеют таких ограничений:

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"

Ответ 5

Согласно этот сайт, обратные ссылки\от 10 до 99 работают на некоторых языках, но не в большинстве.

Те, о которых сообщают, работают

Ответ 6

Это ограничение для 9 обратных ссылок относится к функциям sub() и gsub(), а не к функциям типа grep() и тому подобное. Поддержка более 9 обратных ссылок в R подразумевает использование регулярного выражения 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.)