Найти и заменить переменным текстом - PullRequest
1 голос
/ 09 мая 2019

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

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

Две строки образцов:

Session::flash(   'error', 'Only users with permission may view the directory user.' );
Session::flash( 'error', 'System user ID does not exist.' );

** Желаемый результат: **

flash('Only users with permission may view the directory user.')->error();
flash('System user ID does not exist.')->error();

Текущее регулярное выражение, соответствующее:

Session :: flash (\ s * 'error',. *)

Возможно ли, что строки текста могут быть сохранены и повторно использованы в строках замены? Надеясь найти решение по линии $ variable, чтобы я мог заменить строки на что-то вроде

** Строка желаний: **

вспышка ( 'переменные $') -> ошибка ();

Спасибо, ребята!

Ответы [ 2 ]

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

Вы можете использовать 2 группы захвата и в реферере замены эти группы захвата.

\bSession::flash\(\s*'([^']+)',\s*('[^']+')\s*\);

При замене:

flash($2)->$1;

Объяснение

  • \bSession::flash\(\s* Соответствует границе слова, чтобы Session не являлся частью более длинного слова, затем соответствует Session::flash(, затем 0+ раз символ пробела
  • '([^']+)' Соответствие ', затем захватите в группе 1 соответствие, отличное от ', используя отрицательный класс символов , затем снова сопоставьте '
  • ,\s* Соответствует запятой, за которой 0+ умножается на пробел
  • ('[^']+') Захват в группе 2, соответствующий ', затем не ' и снова '
  • \s*\); Соответствие 0+ раз символу пробела, за которым следует );

Regex demo

Результат:

flash('Only users with permission may view the directory user.')->error;
flash('System user ID does not exist.')->error;
1 голос
/ 09 мая 2019

Здесь вы ищете группу захвата и обратную ссылку.

В регулярном выражении все, что заключено в ( и ), равно captured для последующего использования любым выполнением совпадения с регулярным выражением, которое в данном случае является Sublime Text. Количество поддерживаемых групп захвата зависит от используемой библиотеки регулярных выражений, но обычно вы получаете не менее 10.

При использовании каждый случай () создает capture, причем первый захват нумеруется как 1, второй 2 и т. Д. (Как правило, также все совпадение - захват 0) , Использование последовательности \1 или $1 означает «использовать содержимое первой группы захвата».

В качестве примера рассмотрим регулярное выражение ^([a-z]).\1. Разбивка:

  • ^ - совпадение, начинающееся в начале строки
  • ( - начать захват
  • [a-z] - соответствует одной строчной букве
  • ) - завершить захват
  • . - соответствует любому символу
  • \1 - совпадать с содержимым первого захвата

С учетом этого ввода:

abc
aba
bab

Это регулярное выражение соответствует aba и bab, потому что первый символ в обоих случаях - captured как \1 и должен соответствовать позже. Однако abc не совпадает, потому что в этом случае \1 - это a, а третий символ - c.

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

Как примечание, ваше регулярное выражение, как указано в вашем вопросе выше, не совпадает в Sublime, потому что ( запускает группу захвата и, следовательно, не соответствует (, которое на самом деле есть в тексте. Если вы используете Sublime и включите опцию Highlight Matches на панели Find/Replace, вы увидите, что ваше регулярное выражение не считается совпадением.

Найти:

Session::flash\(\s*'error'\s*,(.*)\);

Заменить:

flash(\1)->error();

Результат:

flash( 'Only users with permission may view the directory user.' )->error();
flash( 'System user ID does not exist.' )->error();

Это более или менее регулярное выражение, изложенное в вашем вопросе, за исключением:

  1. ( и ) в вашем регулярном выражении заменены на \( и \), что означает регулярное выражение в том, что оно должно соответствовать буквальному ( и не должно рассматриваться как начало захват.

  2. .* изменяется на (.*), что означает «любой текст, который появляется здесь, захватите его для дальнейшего использования.

Текст замены относится к тексту, захваченному как \1, и помещает его обратно в замену.

...