Регулярное выражение для соответствия любому файлу .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?

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

  • Веб/smtp.config
  • Библиотеки/Данные/connectionStrings.config

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

  • _config/staging/smtp.config
  • Веб/веб.config
  • Web/web.release.config
  • Интернет/представления/web.config
  • Библиотеки/Данные/app.config
  • Библиотеки/Данные/packages.config
  • Данные/app.config
  • пакеты/MiniProfiler.EF6.3.0.11/lib/net40/MiniProfiler.EntityFramework6.dll.config
  • пакеты/repositories.config

person quentin-starin    schedule 11.11.2014    source источник


Ответы (1)


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

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

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

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

person Brian Stephens    schedule 11.11.2014
comment
+1 Это элегантно. пробовал это около 30 минут - person nu11p01n73R; 11.11.2014