Отрицательная альтернатива vscode/ripgrep

Предположим, я ищу теги изображений, используя функцию поиска vscode:<img src="images/spacer.gif width=1 height=1> но только сопоставляя те без alt="" тег. Как бы я это реализовал?

Я знаю, что негативные lookahead's/lookbehind's не поддерживаются в ripgrep.

^(\s*)<img src="images/spacer.gif"(?!.*alt="".*$).*$ является действительным регулярным выражением, но, увы, не работает из-за вышеуказанного ограничения. Так что же является альтернативой негативным взглядам? Грузы групп захвата?

1 ответ

Решение

Для быстрого и грязного способа вы можете использовать закаленный жадный токен:

<img(?:(?!alt=).)*?>

Смотрите демо на regex101.com.


Объяснение:

<img             # match <img
(?:(?!alt=).)*?  # match anything lazily, making sure there's no
                 # alt ahead
 >               # match >


Это считается плохим подходом, если вы можете ожидать что-то вроде

<img src="/some/source.png" 
     data="Here can be some other <strong>bolded</strong> text">

который полностью действителен. Здесь парсер может помочь.

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