#regex #r
#регулярное выражение #r
Вопрос:
У меня есть некоторые динамические значения, полученные из json
формата {{example_value}}
. У меня есть некоторый R-код, который вычисляет фактическое значение. Однако единственное решение, которое я нашел для замены заполнителя фактическим значением, очень длинное и уродливое.
У кого-нибудь есть какие-нибудь аккуратные решения?
Пример замены {{example_value}}
на 5.5
:
> gsub( gsub("\}","\\}",gsub("\{","\\{","{{example_value}}")),
5.5, "{{example_value}}")
[1] "5.5"
Еще один пример, который объясняет, почему я написал вложенный gsub:
dictionary = "{{example_value}}"
> gsub( gsub("\}","\\}",gsub("\{","\\{",dictionary)),
5.5, "{{example_value}}")
[1] "5.5"
Обычно dictionary
это список, содержащий все динамические значения, которые я ожидаю заменить.
Ответ №1:
Вы можете использовать это:
gsub("{{example_value}}", "5.5", subject, perl=TRUE);
Комментарии:
1. Спасибо, Алекс! Увидимся в следующий раз. 🙂
2. Эй, Алекс, я вижу, идет какая-то дискуссия… в случае, если вам нужны полные вложенные фигурные скобки вместо литерала, я бы использовал это рекурсивное выражение:
{{(?:[^{}] |(?R))*}}
3. Мне нужен литерал, потому что я читаю фигурные скобки из словаря.
4. Да, именно так я это понял, я просто предложил это, потому что заметил, что в комментариях был какой-то конвоир. 🙂
Ответ №2:
Хотя предложение @zx81 кажется наиболее подходящим для прямой замены, вы также можете работать с регулярными выражениями для извлечения тегов в фигурных скобках.
a<-"The total is {{example}} dollars less"
m <- regexpr("{{([^}] )}}", a, perl=T)
regmatches(a, m)
# [1] "{{example}}"
А затем regmatches
имеет приятную функцию, с помощью которой вы можете легко заменять совпадения
regmatches(a, m) <- 5.5
a
# [1] "The total is 5.5 less"
Что является своего рода изящным трюком.
Комментарии:
1. @MrFlick или это,
{{(?:[^{}] |(?R))*}}
чтобы соответствовать таким вещам, как{{ my {{beautiful}} {{nest {{ :) }} }} }}
… Но из требований не похоже, что это то, чего он хочет.
Ответ №3:
РЕДАКТИРОВАТЬ: Возможно, это может привести вас к тому, что вы ищете.
re <- c('{{foo}}', '{{bar}}')
val <- c('5.5', '1.1')
recurse <- function(pattern, repl, x) {
for (i in 1:length(pattern))
x <- gsub(pattern[i], repl[i], x, perl=T)
x
}
x <- 'I have {{foo}} and {{bar}}'
recurse(re, val, x)
# [1] "I have 5.5 and 1.1"
Комментарии:
1. Привет, хотя это правильное решение не подходит для поиска и замены динамических значений на основе словаря существующих динамических значений.
2. Это работает для моей ситуации, когда
x
имеет только один набор фигурных скобок, но мне нужно различать их, еслиx
имеет несколько разных динамических значений.3. Как это соответствует только одному набору фигурных скобок?
4. Такое поведение нежелательно:
> gsub('{{[^}]*}}', '5.5', "{{hmm}} and {{hello}}", perl=T)
выдает[1] "5.5 and 5.5
.5. Это то, что я буду делать, и использовать
lapply
вfrom
векторе! 🙂 Спасибо!