У меня есть file
с чем-то вродеPerl соответствие слишком нежадным регулярное выражение случай
<post href="http://example.com/" description="Example website" tag="more text"/>
То, что я хочу, чтобы это Example website
. Выполнение:
cat file | perl -pe 's/.*description=".*?"//'
работает, как ожидалось, и я получаю tag="more text"/>
, но при попытке:
cat file | perl -pe 's/.*description="(.*)?"/\1/'
я Example website" tag="more text/>
, в то время как я ожидал получить Example website
. Таким образом, кажется, что есть что-то с захватом и обратной ссылкой, которая не работает должным образом, и хотя я думаю, что могу понять, почему, я не уверен, как ее решить.
Я всегда мог сделать:
cat file | perl -pe 's/.*description="//;s/".*//'
, но я действительно хочу, чтобы понять, как решить эту проблему с регулярным выражением, а не делать две замены.
** Не используйте регулярные выражения для анализа HTML. Используйте подходящий модуль синтаксического анализа HTML. ** Вы не можете надежно проанализировать HTML с регулярными выражениями, и вы столкнетесь с печалью и разочарованием в будущем. Как только HTML изменится с ваших ожиданий, ваш код будет сломан. См. Http://htmlparsing.com/perl для примеров того, как правильно анализировать HTML с помощью модулей Perl, которые уже были написаны, протестированы и отлажены. –
Я знаю, что я не должен пытаться анализировать HTML с помощью регулярных выражений, но это XML-код, полученный в ответ от вызова API, поэтому он не отклоняется, поскольку он уже содержит только то, что меня интересует. Если API ответ всегда меняется, так что мой код должен адаптироваться, но в этом случае не будет никаких непредвиденных случаев, которые делают регулярные выражения «опасными» в этом случае. – user137369