Regex search & replace универсальный просмотр назад

У меня есть функция 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"). Итак, да, вы правы, мы могли бы для одного типа журнала указать значение по умолчанию и не беспокоиться об этом.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
66
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не использую Sublime, но регулярное выражение для изоляции вашей функции может быть:

(\blogFun)(\b\(.*)\)

И замените:

$12$2, type = "bug")

Эй, это отлично работает, спасибо! По какой-то причине в возвышенном он избавился от части logFun, но logFun2$12$2, type = "bug"), похоже, работает. :)

Jonny Phelps 11.04.2018 12:21
Ответ принят как подходящий

Поскольку существует несколько типов, можно использовать регулярное выражение для всех из них:

\blog(\w+)\(([^()]+)\)

А затем замените, используя преобразование нижнего регистра PCRE \ L для имени типа после "log".

Заменить строку:

logFun2(\2, type = "\L\1") 

Тест здесь

Также это

Опять же, это отлично сработало, но я обнаружил несколько неприятных случаев в коде: s. Любые идеи, как обойти что-то вроде logDebug(paste("annoying", "case"), msg2 = "data_prep") на нескольких строках, здесь оно останавливается на первой скобке из-за предложения (вполне разумно :)) Спасибо

Jonny Phelps 11.04.2018 12:46

Один из способов - изменить "более 1 чего угодно, кроме (или)" [^()]+. Например: \blog(Debug|Bug|Info|Warning|Fun)\(([^\r\n]+)\). Предполагается, что строка находится в 1 строке. Поскольку по умолчанию .+ - это жадный поиск, он будет соответствовать до последнего ). Возможно, [^\r\n]+ можно было бы заменить на .+, если осмелитесь. Но я думаю, это могло соответствовать многому.

LukStorms 11.04.2018 14:09

спасибо за совет. Мне удалось найти очень конкретное решение для этого случая, скрестив пальцы, больше странных не нахожу :) (\blogDebug)(\b\(.*\).*)\n*\s*(\b.*)\)

Jonny Phelps 11.04.2018 14:16

Так что некоторые все-таки не на одной строчке. Для многострочного с скобками в них? Тогда им будет соответствовать такое регулярное выражение: \blog(\w+)\(((?:[^()]+(?:\([^()]+\))?)*)\)

LukStorms 11.04.2018 15:53

Используя возвышенное, я использовал для ваших случаев:

Находить:(logFun)(\(.+)\)

Заменять:\12\2, type = "bug")

Если у вас также есть logBug, logInfo, logWarning (или даже logDebug(paste("annoying", "case"), msg2 = "data_prep")), вы можете изменить только часть поиска:

Находить:(log[A-Z][a-z]*)(\(.+)\)

Другие вопросы по теме