Regex для извлечения всех строк из исходного кода, используемого при вызове функции - PullRequest
0 голосов
/ 09 мая 2020

У нас есть старый, разросшийся проект с тысячами php файлов, и нам нужно его очистить.

На протяжении всего проекта у нас есть много вызовов функций, подобных:

trans('somestring1');
trans("SomeString2");
trans('more_string',$somevar);
trans("anotherstring4",$somevar);
trans($tx_key);
trans($anotherKey,$somevar);

Все они встроены в код и представляют собой ключи перевода. Я хотел бы найти способ извлечь все «ключи перевода» во всех случаях.

Проект PHP находится в VS Code, поэтому поиск RegEx будет полезен для вывода результатов. Или я мог бы выполнить поиск по проекту с помощью любого другого инструмента, который вы бы порекомендовали.

Однако мне также потребуется «экспортировать» только строки в текстовый файл или аналогичный.

Идеальным результатом будет:

somestring1
SomeString2
more_string
anotherstring4
$tx_key
$anotherKey

В качестве бонуса - если кто-то знает, как я могу получить приведенный выше список, включая имя файла, в котором был найден результат - это будет действительно фантастика c!

Любая помощь был бы очень признателен!

Обновление: Регулярное выражение, которое я придумал:

/(trans)+\([^\)]*\)(\.[^\)]*\))?/gim

перечисляет полное вхождение - Как я могу просто получить первую часть результата (между одиночными кавычками ИЛИ между двойными кавычками ИЛИ начиная с $) См. здесь: regexr.com / 548d4

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Вот несколько шагов, чтобы получить именно то, что вы хотите. Используя это, вы можете выполнять поиск и замену в результатах поиска!

Таким образом, вы можете выполнять поиск / замену последовательного регулярного выражения в правильных обстоятельствах. Замена может выполняться только в редакторе результатов поиска и вообще не затрагивать базовые файлы - это именно то, что вам нужно.

Вы также можете настроить действие замены для редактирования базовых файлов, если вы используете sh.

[Подсказка: этот метод также может значительно упростить выполнение поиска a / замены на b в файлах, содержащих термин c.]

(1) Откройте новый редактор поиска: Ctrl + Shift + P (Эта команда в настоящее время не привязана к привязке клавиш.)

(2) Вставьте это регулярное выражение в поле ввода поиска (с выбранной опцией регулярного выражения .*):

     `(.*?)(\btrans\(['"]?)([^,'")]+)(.*)`  - a relatively simple regex

regex101 demo


См. Мой другой ответ для регулярного выражения для работы с 6 записями в строке:

(\s*\d+:\s)?((.*?)(\btrans\(['"]?)([^,'")]*)((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?)(.*)

(3) Вы получите список файлов с результатами поиска. Теперь откройте виджет поиска Shift + F в этом редакторе поиска.

(4) Поместите то же регулярное выражение в этот ввод поиска. Выбрана опция регулярного выражения. Введите $3 в поле «Заменить». Это заменяет только в этом редакторе поиска - , а не исходные файлы (хотя в некоторых случаях это можно сделать, если вам это нужно). Replace All.


Если вы используете регулярное выражение версии 1-6, замените его на:

$1$5  $9  $13  $17  $21  $25

(5) Вуаля. Теперь вы можете сохранить этот редактор поиска в виде файла.

Search Editor Find


0 голосов
/ 11 мая 2020

Первый ответ работает для одного желаемого захвата в строке, как в исходном вопросе. Но это относительно простое регулярное выражение не будет работать, если их два или более в строке.

Регулярное выражение ниже работает до 6 записей в строке, например

trans('somestring1');
stuff trans("SomeString2"); some content trans("SomeString2a");more stuff [repeat, repeat]

Но это не так. t для 7+ - для этого вам понадобится гуру регулярных выражений .

Вот снова процесс с поворотом , используя вместо этого фрагмент в редакторе поиска поиска / замены. Использование фрагмента позволяет лучше контролировать форматирование конечного результата.

(1) Откройте новый редактор поиска: Ctrl + Shift + P (Эта команда в настоящее время не связана с привязкой клавиш.)

(2) Вставьте это регулярное выражение в поле ввода поиска (с выбранной опцией регулярного выражения. *):

 `((.*?)(\btrans\(['"]?)([^,'")]*)((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?((.*?)(\btrans\(['"]?)([^,'")]*))?)(.*)`  

regex101 demo

(3) Вы получите список файлов с результатами поиска. Теперь выберите все результаты по отдельности с помощью Ctrl + Shift + L .

(4) Запустите эту привязку клавиш:

{
  "key": "alt+i",                              // whatever keybinding you like
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
  "snippet": "${TM_SELECTED_TEXT/((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*)((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?((.*?)(\\btrans\\([\\'\\\"]?)([^,\\'\\\")]*))?)(.*)/$4${8:+\n      }$8${12:+\n      }$12${16:+\n      }$16${20:+\n      }$20${24:+\n      }$24/g}"

  }
},

Этот фрагмент будет применяться к каждому выбору в вашем результате поиска. Эта часть ${8:+\n } является условным условием, которое добавляет новую строку и некоторые пробелы, если есть группа захвата 8 - которая будет второй trans(...) в строке.

Демо: (к сожалению, это не правильно показать Ctrl + Shift + L , выбирая все строки по отдельности или триггер фрагмента Alt + i )

Search Editor with a snippet transform

...