Улучшение моих навыков регулярных выражений - PullRequest
0 голосов
/ 13 июля 2009

Я давно хотел улучшить свои навыки регулярных выражений, и "Освоение регулярных выражений" рекомендовалось довольно много раз, поэтому я купил его и читал его в течение последнего дня или около того.

Я создал следующее регулярное выражение:

^(?:<b>)?(?:^<i>)?<a href="/site\.php\?id=([0-9]*)">(.*?) \(([ a-z0-9]{2,10})\)</a>(?:^</i>)?(?:</b>)?$

Соответствует первым двум ссылкам, но игнорирует две, заключенные в тег <i>. Извлекает идентификатор, заголовок и тип.

<a href="/site.php?id=6321">site 1 title (type 1)</a>
<b><a href="/site.php?id=10254">site 2 title (type 2)</a></b>

<i><a href="/site.php?id=5479">site 3 title (type 3)</a></i>
<b><i><a href="/site.php?id=325">site 4 title (type 4)</a></i></b>

Несмотря на то, что это работает, кажется, что что-то настолько простое, можно ли его улучшить?

Ответы [ 2 ]

5 голосов
/ 13 июля 2009

Если не использовать классы символов (\ d для 0-9 и т. Д.), Я не вижу, чтобы рассматриваемое регулярное выражение могло быть значительно сокращено; однако ...

В качестве примечания стоит упомянуть, что анализ HTML с помощью регулярных выражений в лучшем случае опасен; при работе с HTML (и в меньшей степени с XML) инструменты DOM, как правило, лучше подходят.

1 голос
/ 13 июля 2009

Если вы пишете скриншоты, как справедливо упоминает Уиллихем, DOM может быть просто подходящим парсером для Regex, так как HTML гораздо более щадящий, чем regex.

Не сильно сокращено, но немного более регулярное выражение

  • Удалены начало строки и конец проверка строк, вам действительно нужно их
  • отрицательный взгляд сзади, чтобы убедиться, что <a> не предшествует <i>
  • использование \ d простой диссертации вместо [0-9] немного чище.
  • Вы набрали от 3 до 11 символов, я изменил его на 3 или более.
  • удалены проверки для конечных тегов, они не имеют никакого контекстуального значения для вашего скриншота (предположительно).

(?<!<i>)<a href="/site.php\?id=(\d*)">(.*?) \(([ a-z\d]{2,})\)

...