Заголовок html .net regex - PullRequest
       2

Заголовок html .net regex

1 голос
/ 09 февраля 2012

Я пытаюсь извлечь все данные из тегов заголовка в документе Word, преобразованном в HTML (через слово)

У меня есть следующее регулярное выражение:

<(?<Class>h[5|6|7|8])>(?<ListIdentifier>.*?)<span style='font:7.0pt "Times New Roman"'>(?:&nbsp;)+.+</span>(?<Text>.*?)(?:</h[5|6|7|8]>)?

и мой исходный текст выглядит следующим образом

<h5>(1)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>The Scheme (planning scheme) has been
prepared in accordance with the <i>asdf </i>(the Act)
as a framework for managing development in a way that advances the purpose of
the Act.</h5>

<h5>(2)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>In seeking to achieve this purpose, the planning scheme sets out
the future development in the
planning scheme area over the next 20 years.</h5>

<h5>(3)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>While the planning scheme has been prepared with a 20 year horizon, it
will be reviewed periodically in accordance with the Act to ensure that it
responds appropriately to the changes of the community at Local, Regional and State
levels.</h5>

Регулярное выражение работает, однако оно захватывает от первого h5 до последнего или любого другого h6 | 7 | 8.

Я не пытаюсь сделать что-то здесь сложное с данными, мне нужно просто извлечь их, поэтому я бы хотел использовать регулярные выражения, а не использовать html-парсер, в моих примерах было бы справедливо сказать заголовки хорошо сформированы, т.е. hX всегда закрывается hX, а не hY, а внутри заголовков нет заголовков или чего-то подобного.

Я думал добавить? до конца (? :) сделало бы его несжидким, чтобы оно соответствовало только первому экземпляру, а не так много, как могло бы, я что-то здесь упускаю из-за того, как работает жадность?

EDIT:

Регулярное выражение

<(?<Class>h[5-8])>(?<ListIdentifier>.*?)<span style='font:7.0pt "Times New Roman"'>(?:&nbsp;)+.+?</span>(?<Text>.*?)(?:</h[5-8]>)

также, кажется, соответствует

<h6>&nbsp;</h6>

<h6>&nbsp;</h6>

<h6>&nbsp;</h6>

<h6>&nbsp;</h6>

<h5>(1)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>Short Title -The planning scheme policy may be cited as PSP No 2. –
Engineering Standards – Road and Drainage Infrastructure.</h5>

так что он включает весь текст, тогда как я хотел бы, чтобы он игнорировал h6s с nbsp, так как у них нет промежутка внутри них

1 Ответ

2 голосов
/ 09 февраля 2012

В центре регулярного выражения есть жадный .+, вызывающий проблему (непосредственно перед </span>). Измените это на .+?, и ваше регулярное выражение должно работать правильно.

Обратите внимание, что ваши классы символов должны быть [5678] вместо [5|6|7|8] (подразумевается ИЛИ между символами) и могут даже быть сокращены до [5-8].

Вы также должны удалить завершающий ? с конца, (?:</h[5-8]>)? должен быть (?:</h[5-8]>). Без этого изменения ваш матч закончится раньше, чем должен.

edit: Причина, по которой текущее регулярное выражение соответствует тексту, введенному вами в редактирование, заключается в том, что .*? в группе ListIdentifier будет соответствовать </hX>, если span и nbsp не совпадают видел до этого. Вы должны быть в состоянии исправить это, изменив значение .*? на [^<]*, которое не будет совпадать с меньшим количеством знаков, поэтому потребуется наличие диапазона.

Результат:

<(?<Class>h[5-8])>(?<ListIdentifier>[^<]*)<span style='font:7.0pt "Times New Roman"'>(?:&nbsp;)+.+?</span>(?<Text>.*?)(?:</h[5-8]>)
...