Я уже давно хотел улучшить свои навыки регулярного выражения, и «Освоение регулярных выражений» было рекомендовано несколько раз, поэтому я купил его и читал его за последний день или около того ,Улучшение моих навыков регулярного выражения
Я создал следующее регулярное выражение:
^(?:<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>
Несмотря на то, что это работает, кажется, довольно долго для чего-то такого простого, можно ли его улучшить?
несколько вещей: Как это соответствует типу? Похоже, что это будет соответствовать словам, отличным от типа в parens. Кроме того, вы хотите, чтобы иметь возможность сопоставить что-то вроде «(нормальный материал здесь)» <---- обратите внимание, что нет закрывающего тега. Кроме того, вы хотите, чтобы id был пустым? т.е. - "id ="? – Tom
Вы понимаете, что (?:)? не имеет «памяти» (?: ) ?. На самом деле вы, вероятно, хотите второй, только если появится первый. Формально говоря, регулярные выражения НЕ МОГУТ обработать это, хотя есть некоторые расширения регулярных выражений в определенных языках программирования, которые могут его обрабатывать (я думаю, они называют это обратным сопоставлением ... но это действительно не то, что могут делать регулярные выражения). – Tom
На данный момент я просто хочу сопоставить приведенные выше примеры. Вы правы в конце тегов, и это пришло мне в голову, когда я его создавал. Кроме того, часть типа может содержать что угодно, а не только тип, за которым следует число. – DanCake