Регулярные выражения - поиск и сравнение первого экземпляра слова - PullRequest
1 голос
/ 28 мая 2010

В настоящее время я пытаюсь написать регулярное выражение для удаления ссылок со страницы, которая у меня есть. Проблема заключается в том, что ссылки нужно извлекать только в том случае, если ссылки имеют «запас», например. Вот набросок того, что у меня есть код мудрый:

<td class="prd-details">
   <a href="somepage">
   ...
   <span class="collect unavailable">
   ...
</td>

<td class="prd-details">
   <a href="somepage">
   ...
   <span class="collect available">
   ...
</td>

То, что я хотел бы сделать, это вытащить ссылки, только если в теге есть «собирать доступные». Я пытался сделать это с помощью регулярного выражения:

(?s)prd-details[^=]+="([^"]+)" .+?collect{1}[^\s]+ available

Однако, запустив его, он найдет первый класс 'prd-details' и продолжит работу, пока не найдет 'collection available', что приведет к неверным результатам. Я подумал, указав {1} после слова собирать, он будет использовать только первый экземпляр найденного слова, но, очевидно, я ошибаюсь. Я пытался использовать разные вещи, такие как позитивные и негативные взгляды, но я не могу заставить что-либо работать.

Может ли кто-нибудь помочь мне с этим вопросом?

Спасибо

Dan

Ответы [ 2 ]

0 голосов
/ 28 мая 2010

Вам нужно выражение, которое знает, что «сбор недоступен» - это мусор. После перехвата ссылки вы должны иметь возможность использовать отрицательный прогноз с подстановочным знаком. Что-то вроде:

prd-details[^=]+="([^"]+)"(.(?!collect un))+?collect available

Это будет собирать любого персонажа после ссылки, за которой не следует "collect un". Это должно исключить захват фрагмента «собрать недоступно» вместе с «собрать доступно».

Я тестировал на C #, рассматривая текст как одну строку. Вам может понадобиться немного другой синтаксис и параметры в зависимости от вашего языка и библиотеки регулярных выражений.

0 голосов
/ 28 мая 2010

Если вы настаиваете на том, чтобы сделать это с помощью регулярных выражений, я рекомендую двухэтапный подход «разделить-затем-проверить»:

  • Сначала разбейте на каждый prd-details.
  • Затемвнутри каждого prd-details посмотрите, содержит ли оно collect available
    • Если да, то вытащите href

Это проще, чем пытатьсясделать все за один шаг.Легче читать, писать и поддерживать.

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