Regex для соответствия любому файлу.config с несколькими исключениями

Я пытаюсь настроить регулярное выражение для использования в файле.hgignore, которое будет игнорировать различные копии файлов.config, сделанные во время отладки.

Регулярное выражение должно соответствовать любому пути, оканчивающемуся на .config до тех пор, пока путь не начинается с _config, config, или же packages и пока имя файла (символы, следующие сразу за последней косой чертой) не app, web, packages, или же repositories (или web.release, web.debug).

Самое близкое, что мне кажется, это

^(?!(_config|[Cc]onfig|packages)).*\/(?!([Aa]pp|[Ww]eb|packages|repositories)\.).*config$

Это будет правильно игнорировать Data/app.configи, похоже, работает со всеми остальными случаями, но будет некорректно соответствовать Libraries/Data/app.config, Когда я проверяю это на http://regex101.com/ это показывает, что .*\/ группа соответствует только через Libraries/не Libraries/Data/ как я и предполагал.

Я пытался изменить его на

^(?!(_config|[Cc]onfig|packages))(.*\/)*(?!([Aa]pp|[Ww]eb|packages|repositories)\.).*config$

Но тогда группа (.*\/)* кажется, соответствует целому пути для любого .config файл.

Если я изменю последний негативный взгляд на соответствующую группу, например,

^(?!(_config|[Cc]onfig|packages))(.*\/)(([Aa]pp|[Ww]eb|packages|repositories)\.).*config$

Тогда (.*\/) Матчи Libraries/Data/Это то, что я хочу и ожидал, но, похоже, негативная перспектива меняет поведение соответствия (.*\/),

Я не уверен, куда идти отсюда? Условия, которые я пытаюсь соответствовать или не соответствовать, не кажутся такими сложными, но я не самый опытный с регулярными выражениями. Может быть, есть более простой способ добиться того же в.hgignore?

Это примеры путей, которые должны совпадать и игнорироваться:

  • Web / smtp.config
  • Библиотеки /Data/connectionStrings.config

Это примеры путей, которые НЕ должны совпадать и не должны игнорироваться

  • _config/ постановка / smtp.config
  • Web / web.config
  • Web / web.release.config
  • Web / Views / web.config
  • Библиотеки /Data/app.config
  • Библиотеки /Data/packages.config
  • Данные / app.config
  • Пакеты /MiniProfiler.EF6.3.0.11/ Библиотека /net40/MiniProfiler.EntityFramework6.dll.config
  • Пакеты / repositories.config

1 ответ

Решение

Вы были очень близки Попробуйте это регулярное выражение на регулярном выражении101:

^(?!_?config|packages).*\/(?!(app|web|packages|repositories)\.)[^\/]*config$

Я немного упростил это, но главное изменение заключалось в том, чтобы не указывать косые черты в совпадении перед "конфигом".

Примечание: я использовал флаг без учета регистра, чтобы упростить само регулярное выражение.

Другие вопросы по тегам