Заменить подчеркивание тире в URL для заданных расширений URL с помощью GREP / Regex

Я использую BBEdit. BBEdit поддерживает поиск по нескольким файлам и заменяет его на GREP. Используя это (скопировано из записи Notepad++ здесь в stackru):

(\bhref="|(?!^)\G)[^"<_]*\K_

Я могу получить список всех URL-адресов, содержащих подчеркивание. Идея состоит в том, чтобы заменить все подчеркивания тире. Никаких проблем с этим, панель поиска BBEdit имеет поле "Заменить" (как Notepad++).

Все хорошо, НО я не хочу обрабатывать все URL на самом деле. Например, существуют URL-адреса для загрузки файлов, которые должны оставаться без изменений, особенно URL-адреса с расширениями.exe,.zip,.sit и.dmg. На самом деле URL-адреса, которые я хочу обработать, - это URL-адреса.php и.html.

Я имею в виду этот тип URL должен быть найден здесь:

<a href="software/internet-tools/ftp-disk_sheet_us.php">

но не этот

<a href="software/internet-tools/ftp-disk_us_setup.exe">

До сих пор я безуспешно пытался отредактировать REGEX, описанный выше, и, поскольку мне нужно обработать около 30000 URL-адресов в 600 файлах, я действительно хотел бы убедиться, что я не сделал ничего плохого.

Заранее большое спасибо за помощь в этом.

1 ответ

Решение

Вы можете форсировать матч только тогда, когда ссылка заканчивается .html/.htm или же .php:

(?:\G(?!^)|\bhref="(?=[^"]*\.(?:html?|php)"))[^"<_]*\K_
                   ^^^^^^^^^^^^^^^^^^^^^^^^^

Посмотреть демо-версию регулярного выражения

(?=[^"]*\.(?:html?|php)") положительный взгляд потребует любые 0+ символов кроме " а затем . с последующим htm/html или же php незамедлительно после href="иначе совпадение не будет найдено.

подробности

  • (?:\G(?!^)|\bhref="(?=[^"]*\.(?:html?|php)")) - конец предыдущего матча (\G(?!^)) или же (|)
    • \bhref=" - целое слово href с последующим ="
    • (?=[^"]*\.(?:html?|php)") - позитивный прогноз, который требует, чтобы следующие последовательности шаблонов соответствовали непосредственно справа от текущего местоположения:
      • [^"]* - 0+ символов кроме "
      • \. - точка
      • (?:html?|php) - группа без захвата, соответствующая либо htm а затем необязательный l или же php
      • " - двойная кавычка
  • [^"<_]* - любые 0+ символов кроме ", < а также _
  • \K - оператор сброса соответствия, который отбрасывает весь найденный текст
  • _ подчеркивание
Другие вопросы по тегам