Как заставить это регулярное выражение работать? - PullRequest
3 голосов
/ 01 сентября 2010

У меня небольшая проблема, я хочу найти в

<tr><td>3</td><td>foo</td><td>2</td>

фу, я использую:

$<tr><td>\d</td><td>(.*)</td>$

чтобы найти foo, но он не работает, потому что он не совпадает с </td> в конце foo, но с </td> в конце строки

Ответы [ 3 ]

2 голосов
/ 01 сентября 2010

Вы должны сделать .* ленивым вместо жадного. Подробнее о ленивых против жадных здесь .
Ваш конец якоря строки ($) также не имеет смысла. Попробуйте:

<tr><td>\d<\/td><td>(.*?)<\/td>

(Как видно на Рубуляр .)

ПРИМЕЧАНИЕ. Я не рекомендую использовать регулярные выражения для разбора HTML. Но иногда эта задача достаточно проста, чтобы ее можно было выполнить с помощью регулярных выражений, для которых полноценный синтаксический анализатор XML является излишним (например, этот вопрос). Умение выбрать «правильный инструмент для работы» является важным навыком в программировании.

0 голосов
/ 01 сентября 2010

Ваш ведущий $ должен быть ^.

Если вы не хотите полностью соответствовать концу строки, не используйте $ в конце. Однако, поскольку * является жадным, он будет захватывать столько, сколько сможет. Некоторые реализации регулярных выражений имеют не жадную версию, которая будет работать, но вы, вероятно, просто хотите изменить (.*) на ([^<]*).

0 голосов
/ 01 сентября 2010

Использование:

^<tr><td>\d</td><td>(.*?)</td>

(вставить обязательный комментарий о неиспользовании регулярного выражения для анализа xml)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...