Я использую Notepad++ для поиска/замены и не могу получить то, что мне нужно.
Мой текущий вывод генерируется с помощью ^(.+)$
в качестве поиска и ,dim_date[(\1)].alias\((\1)\)
в качестве замены. Это близко, но я не могу получить заглавные буквы между круглыми скобками, как в желаемом выводе.
Если я смогу изменить поиск/замену, чтобы сделать все это за один шаг, это круто; но я не против сохранить свой первый поиск/замену, а затем выполнить еще один поиск/замену, чтобы сделать случай змеи с заглавной буквы. Что угодно, проще.
Пример ввода:
'business_year'
'business_year_month'
'business_year_quarter'
Мой текущий вывод:
,dim_date['business_year'].alias('business_year')
,dim_date['business_year_month'].alias('business_year_month')
,dim_date['business_year_quarter'].alias('business_year_quarter')
Желаемый результат:
,dim_date['business_year'].alias('Business_Year')
,dim_date['business_year_month'].alias('Business_Year_Month')
,dim_date['business_year_quarter'].alias('Business_Year_Quarter')
...Если str = 'business_year_quarter'
, ",dim_date['#{str}'].alias('#{str.gsub(/(?<=_)[a-z]/, h)}'\)" #=> ",dim_date['business_year_quarter'].alias('business_Year_Quarter')"
.
В два этапа (из образца ввода):
'business_year'
'business_year_month'
'business_year_quarter'
Сначала найдите ('|_)(\w)
заменить на $1\U$2\E
:
'Business_Year'
'Business_Year_Month'
'Business_Year_Quarter'
Затем найдите ^(.+)$
заменить на ,dim_date[(\L$1\E)].alias\($1\)
:
,dim_date['business_year'].alias('Business_Year')
,dim_date['business_year_month'].alias('Business_Year_Month')
,dim_date['business_year_quarter'].alias('Business_Year_Quarter')
'([a-z]+)(?:_([a-z]+)(?:_([a-z]+))?)?'
,dim_date[$0].alias\('\u$1(?2_\u$2(?3_\u$3))'\)
. matches newline
Объяснение:
' # single quote
([a-z]+) # group 1, 1 or more lowercase
(?: # non capture group
_ # underscore
([a-z]+) # group 2, 1 or more lowercase
(?: # non capture group
_ # underscore
([a-z]+) # group 3, 1 or more lowercase
*** you can add as many groups as needed
)? # end group, optional
)? # end group, optional
' # single quote
Замена:
,dim_date[ # literally
$0 # the whole match
].alias\(' # lierally
\u$1 # uppercase the first letter of group 1
(?2 # if group 2 exists
_\u$2 # underscore and upper the first letter of group 2
(?3 # if group 3 exists
_\u$3 # underscore and upper the first letter of group 3
) # endif
) # endif
'\) # literally
Скриншот (до):
Скриншот (после):
Спасибо за добавление подробного объяснения по этому поводу. Помогает с будущими потребностями
Если вам это нужно для произвольного количества key_
деталей, мне это помогло. Искать:
^(?=(.+))|([a-z]+_?)(')?
И замените на:
(?1,dim_date[$1].alias\(:\u$2(?3'\)))
Левая часть чередования предназначена для захвата полной линии (той, которая будет слева от менструации), не потребляя ее. Правая часть соответствует каждой части key_
для написания заглавной первой буквы с использованием \l. Последняя группа фиксирует одинарную кавычку в конце, чтобы позже проверить это условие.
В условии замены будет проверяться, соответствует ли первая группа. Если да, то захваченное значение вставляется в dim_date[
$1
].alias\(
:
else \u
будет делать заглавной первую букву каждой ключевой части, захваченной $2
. Третья группа предназначена для закрытия с помощью '\)
, если была найдена одинарная кавычка.
Предполагается, что это будет работать как немного другая демо-версия PCRE2 (не работает в Notepad++). Конечно, рекомендуется сделать всего две простые замены, но мне было любопытно, сработает ли это.
Вот один из способов, который можно сделать в Ruby. Я упоминаю, что должен быть способ реализовать ту же идею в Notepad++. Сначала создайте хэш (словарь), который сопоставляет строчные буквы с их эквивалентами в верхнем регистре:
h = ('a'..'z').zip('A'..'Z').to_h #=> {"a"=>"A", "b"=>"B", ... , "z"=>"Z"}
. Например,h['b'] #=> 'B'
. Тогда используйте вторую форму метода String#gsub...