notepad ++ регулярное выражение заменяет внутреннюю последовательность сопоставленного текста - PullRequest
2 голосов
/ 22 апреля 2020

Как мне заменить все вхождения "cast (net_price как десятичное число (9,2)) = xxx AND" на "ROUND (net_price, 2) = xxx AND" при сохранении xxx в Notepad ++? Операторы вложены в другие операторы AND, как показано ниже:

Каковы необходимые параметры поиска и замены для notepad ++?

Пример текста:

OR (cast(net_price as decimal(9,2))=@var2 AND cost=@var3 AND blah)

Пример результата:

OR (ROUND(net_price,2)=@var2 AND cost=@var3 AND blah)

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

Я думал, что net_price.*AND будет соответствовать net_price, а затем что угодно, пока не найдет AND. Я просто ошибаюсь, и если кто-то может объяснить, почему я был бы признателен.

Ответы [ 2 ]

3 голосов
/ 22 апреля 2020
  • Ctrl + H
  • Найти что: cast\((net_price) as decimal\(9,2\)\)(?==@var2 AND)
  • Заменить на: ROUND\($1,2\)
  • CHECK Обтекание
  • CHECK Регулярное выражение
  • Заменить все

Объяснение:

cast\(                  # literally
(net_price)             # group 1, "net_price"
as decimal\(9,2\)\)     # literally
(?==@var2 AND)          # positive lookahead, make sure we have "=@var2 AND" after

Замена:

ROUND\($1,2\)

Снимок экрана (до ):

enter image description here

Снимок экрана (после):

enter image description here

0 голосов
/ 23 апреля 2020

Извиняюсь за упрощенный вопрос. Я отредактировал его, чтобы отразить более сложный вопрос. Отправка ответа в надежде вернуть ответ.

Я должен был указать, что выборочные данные могут быть десятичными (9,2) или плавающими, или даже десятичными (9,4). так что это намного сложнее, чем просто поиск и замена. Извините, что пытался упростить публикацию, я слишком упрощен !!

Оказалось, что правильный регистр неверен. * Так как это жадное совпадение, мне нужно было использовать. *? соответствовать только первому оператору AND после net_price. Поскольку жадное совпадение будет соответствовать последнему шаблону, который он может найти, а затем оглянуться назад, чтобы соответствовать последнему AND. который выделил бы слишком большую часть строки - вот в чем заключалась моя проблема.

Таким образом, регулярное выражение становится: cast\((net_price).*?\=(.*?) AND которое:

finds cast( 
finds net_price and puts it into capture group 1
non greedy scans until it finds an equals character
captures non greedily the value into group 2
finds the AND

, которое захватывает в 2 группы net_price всегда в группа 1 и переменная / количество всегда в группе 2, все остальное переписывается:

Замена становится: ROUND\($1,2\)=$2 AND

, который заменяет $ 1 (группа захвата 1) на net_price и $ 2 ( захватить группу 2) со значением.

notepad ++ окно поиска и замены: notepad++ search and replace window:

...