Regex захватывает слишком много текста
Допустим, у меня есть следующий текст:
foo bar baz <!-- USERNAME --> <!-- ACCESS_KEY --> baz bar foo
<!--:USERNAME-->
<!-- eueuteh -->
-DarchetypeVersion=<!-- java-version --> -UserName=<!-- :USERNAME --> -DsauceAccessKey=<!-- ACCESS_KEY -->
Что я хочу сделать, это заменить <!-- USERNAME -->
с каким-то другим текстом. К сожалению, созданное мной регулярное выражение на самом деле не работает так, как задумано, а, например, заменяет целое <!-- java-version --> -UserName=<!-- :USERNAME -->
выражение. Первые два случая заменены правильно. Где ошибка?
Вот что я тестировал в консоли javascript:
var re = new RegExp('(<!--)(.)*(USERNAME)(.)?(-->)');
2 ответа
Решение
Я использую описанную ниже технику с такими вещами, как HTML, XML и аналогичными (хотя это и плохая практика, когда речь идет о вложенном контенте)
Regex
(<[^>]*)(USERNAME)([^>]*>)
демонстрация
Правильное выражение выглядит так:
/<!--(.(?!-->))*USERNAME.*?-->/g