У меня есть функция R, которая похожа на эту:
logFun <- function(msg1, msg2){
return(sprintf("%s: %s", msg1, msg2))
}
logFun("123", "456")
Он используется во многих местах и не всегда хорошо вводится, например. это все примеры использования:
var1 <- "aa"
var2 <- "bb"
logFun(var1, var2)
logFun("aa", var2)
logFun("aa", "bb")
logFun(var1, "bb")
logFun(msg1 = "aa", msg2 = "bb")
logFun(msg1 = var1, msg2 = "bb")
...
Скажем, у меня появилась новая функция, например.
logFun2 <- function(msg1, msg2, type){
return(sprintf("[%s] %s: %s", type, msg1, msg2))
}
logFun2("123", "456", "bug")
и вызовы функций должны быть сохранены (msg1, msg2, type), так как многие из них были преобразованы из logFun в logFun2. Что я пытаюсь сделать с Sublime, так это заменить приведенный выше список вариантов использования следующим:
logFun2(var1, var2, type = "bug")
logFun2("aa", var2, type = "bug")
logFun2("aa", "bb", type = "bug")
logFun2(var1, "bb", type = "bug")
logFun2(msg1 = "aa", msg2 = "bb", type = "bug")
logFun2(msg1 = var1, msg2 = "bb", type = "bug")
Я читал кое-что о сопоставлении ретроспективного поиска, но обнаружил, что сложно выяснить, выполнима ли эта работа или мне следует найти другое решение проблемы. С помощью https://regex101.com/ мне удалось изолировать часть logFun( с помощью (?<=logFun\(), но я не уверен, что делать дальше. Любое руководство будет оценено :)
Спасибо, Джонни
Редактировать 1
Вопрос: Почему вы не можете определить свою функцию logFun2 со значением по умолчанию для аргумента type = "bug" и просто заменить logFun на logFun2?
А: На самом деле у нас есть не просто logFun. Мы говорим, что у нас есть функции logBug, logInfo, logWarning и т. д. Затем мы заменяем их на сингулярную функцию logGeneral, например. logBug становится logGeneral(.., .., type = "bug").
Итак, да, вы правы, мы могли бы для одного типа журнала указать значение по умолчанию и не беспокоиться об этом.





Я не использую Sublime, но регулярное выражение для изоляции вашей функции может быть:
(\blogFun)(\b\(.*)\)
И замените:
$12$2, type = "bug")
Поскольку существует несколько типов, можно использовать регулярное выражение для всех из них:
\blog(\w+)\(([^()]+)\)
А затем замените, используя преобразование нижнего регистра PCRE \ L для имени типа после "log".
Заменить строку:
logFun2(\2, type = "\L\1")
Тест здесь
Опять же, это отлично сработало, но я обнаружил несколько неприятных случаев в коде: s. Любые идеи, как обойти что-то вроде logDebug(paste("annoying", "case"), msg2 = "data_prep") на нескольких строках, здесь оно останавливается на первой скобке из-за предложения (вполне разумно :)) Спасибо
Один из способов - изменить "более 1 чего угодно, кроме (или)" [^()]+. Например: \blog(Debug|Bug|Info|Warning|Fun)\(([^\r\n]+)\). Предполагается, что строка находится в 1 строке. Поскольку по умолчанию .+ - это жадный поиск, он будет соответствовать до последнего ). Возможно, [^\r\n]+ можно было бы заменить на .+, если осмелитесь. Но я думаю, это могло соответствовать многому.
спасибо за совет. Мне удалось найти очень конкретное решение для этого случая, скрестив пальцы, больше странных не нахожу :) (\blogDebug)(\b\(.*\).*)\n*\s*(\b.*)\)
Так что некоторые все-таки не на одной строчке. Для многострочного с скобками в них? Тогда им будет соответствовать такое регулярное выражение: \blog(\w+)\(((?:[^()]+(?:\([^()]+\))?)*)\)
Используя возвышенное, я использовал для ваших случаев:
Находить:(logFun)(\(.+)\)
Заменять:\12\2, type = "bug")
Если у вас также есть logBug, logInfo, logWarning (или даже logDebug(paste("annoying", "case"), msg2 = "data_prep")), вы можете изменить только часть поиска:
Находить:(log[A-Z][a-z]*)(\(.+)\)
Эй, это отлично работает, спасибо! По какой-то причине в возвышенном он избавился от части
logFun, ноlogFun2$12$2, type = "bug"), похоже, работает. :)