RegEx: Найти и заменить snake_case на UpperCamelCase / PascalCase между символами - PullRequest
1 голос
/ 30 июня 2019

Я использую функцию IDE «Найти и заменить» (w / RegEx), чтобы найти и заменить параметр типа аргументов для перехода от snake_case к PascalCase (AKA UpperCamelCase). В проекте есть несколько файлов и строк, которые необходимо изменить, и ручное выполнение этого довольно подвержено ошибкам и утомительно (плюс я уверен, что мне понадобится необходимый шаблон снова для будущих изменений).

Например:

CURRENT: function find_all_by_name_and_status(_i_find_all_by_name_and_statusCriteria find_all_by_name_and_status_criteria) ...

Должно быть:

DESIRED: function find_all_by_name_and_status(IFindAllByNameAndStatusCriteria find_all_by_name_and_status_criteria) ...

Шаблоны, которые я использую, следующие:

FIND: (?<=\()_(.)(Criteria)*

REPLACE: \U$1\L

Шаблон замены будет работать, насколько я вижу, если первая найденная группа захвата будет правильной (буква сразу после "_").

Шаблон ядра _(.) находит правильные компоненты для замены, однако он также фиксирует и другие части строки. Итак, я добавил положительный взгляд за (?<=\(), чтобы начать с открывающих скобок, и завершающий фиктивный захват для (Criteria)*. Кажется, что весь шаблон приводит к тому, что основной шаблон совпадает только один раз, а не повторно (?R) похоже тоже не помогает.

приписка

Похоже, (Criteria)* тоже ничего не делает, но я решил, что это вторая проблема, которую нужно решить после получения базового шаблона для поиска всех совпадений / повторов.

Я чувствую, что близок к решению, но пока не совсем. Я, конечно, мог бы быть ОЧЕНЬ отстраненным от решения. Любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Это работает с Notepad ++

  • Ctrl + H
  • Найти что: (\(|\G)_(.[^\W_]*)(?=\w+Criteria)
  • Заменить на: $1\u$2
  • check Match case
  • check Wrap вокруг
  • check Регулярное выражение
  • Заменить все

Пояснение:

(\(|\G)             # group 1, openning parenthesis or restart from last match position
_                   # underscore
(.[^\W_]*)          # group 2, 1 any character followed by 0 or more alphanum
(?=\w+Criteria)     # positive lookahead, make sure we have 1 or more word character and Criteria

Замена:

$1          # content of group 1
\u$2        # content of group 2 with first character uppercased

Результат для данного примера:

function find_all_by_name_and_status(IFindAllByNameAndStatusCriteria find_all_by_name_and_status_criteria) ...

Снимок экрана:

enter image description here

1 голос
/ 30 июня 2019

Это выражение,

(.*\()|(_)([a-z])([a-z]*)|(Criteria.*)

, которое на самом деле не является лучшим, с заменой чего-то похожего на:

$1\U$3\L$4\E$5

, вероятно, может работать здесь (\Eдля демонстрации).

В этом демо на правой панели объяснено выражение, если вам может быть интересно.

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

...