gsubfn
похоже на gsub
, за исключением того, что замещающая строка является замещающей функцией , которая принимает совпадение в качестве входного и заменяет его выходным.Функция может быть выражена с помощью формульной нотации (как мы делаем здесь) или обычной функциональной нотации.
Внутренний gsubfn
принимает строку [...]
и заменяет числа в ней на эти числа плюс 15, а внешний gsubfn
передает [...]
внутреннему.Обратите внимание, что регулярное выражение \\[.*?\\]
соответствует левой квадратной скобке \\[
, за которой следует самая короткая строка .*?
до следующей правой квадратной скобки \\]
.
Это решение компактное (только одна строка),использует только относительно простые регулярные выражения, не перезаписывает свой ввод и векторизован (т. е. String
может быть вектором).
library(gsubfn)
gsubfn("\\[.*?\\]", ~ gsubfn("\\d+", ~ as.numeric(x) + 15, x), String)
## " John was going .[16] Sam was Walking [17,18]. Rita was reading [19] . Donald was cooking with 3 spoons [20-22]"
Если достаточно увеличить все числа, то это можно упростить до:
gsubfn("\\d+", ~ as.numeric(x) + 15, String)
## [1] " John was going .[16] Sam was Walking [17,18]. Rita was reading [19] . Donald was cooking with 18 spoons [20-22]"