Используйте Notepad++ для написания заглавных букв в змеином регистре

Я использую 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')

Вот один из способов, который можно сделать в Ruby. Я упоминаю, что должен быть способ реализовать ту же идею в Notepad++. Сначала создайте хэш (словарь), который сопоставляет строчные буквы с их эквивалентами в верхнем регистре: h = ('a'..'z').zip('A'..'Z').to_h #=> {"a"=>"A", "b"=>"B", ... , "z"=>"Z"}. Например, h['b'] #=> 'B'. Тогда используйте вторую форму метода String#gsub...

Cary Swoveland 19.06.2024 09:27

...Если str = 'business_year_quarter', ",dim_date['#{str}'].alias('#{str.gsub(/(?<=_)[a-z]/, h)}'\)" #=> ",dim_date['business_year_quarter'].alias('business_Year_Qua‌​rter')".

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

Ответы 3

В два этапа (из образца ввода):

'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')
Ответ принят как подходящий
  • Ctrl+H
  • Найдите что: '([a-z]+)(?:_([a-z]+)(?:_([a-z]+))?)?'
  • Заменить на: ,dim_date[$0].alias\('\u$1(?2_\u$2(?3_\u$3))'\)
  • TICK Матч-футляр
  • КЛИК Обернуть вокруг
  • ВЫБРАТЬ Регулярное выражение
  • СНЯТЬ . matches newline
  • Replace all

Объяснение:

'               # 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

Скриншот (до):

Скриншот (после):

Спасибо за добавление подробного объяснения по этому поводу. Помогает с будущими потребностями

simplicITy 18.06.2024 19:09

Если вам это нужно для произвольного количества key_ деталей, мне это помогло. Искать:

^(?=(.+))|([a-z]+_?)(')?

И замените на:

(?1,dim_date[$1].alias\(:\u$2(?3'\)))

Левая часть чередования предназначена для захвата полной линии (той, которая будет слева от менструации), не потребляя ее. Правая часть соответствует каждой части key_ для написания заглавной первой буквы с использованием \l. Последняя группа фиксирует одинарную кавычку в конце, чтобы позже проверить это условие.

В условии замены будет проверяться, соответствует ли первая группа. Если да, то захваченное значение вставляется в dim_date[$1].alias\(:else \u будет делать заглавной первую букву каждой ключевой части, захваченной $2. Третья группа предназначена для закрытия с помощью '\), если была найдена одинарная кавычка.

Предполагается, что это будет работать как немного другая демо-версия PCRE2 (не работает в Notepad++). Конечно, рекомендуется сделать всего две простые замены, но мне было любопытно, сработает ли это.

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