Intereting Posts

Regex – я хочу только совместить начальные tags в регулярном выражении

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

*some text here, some other tags may be here as well but no ending 'p' tag*

  

Affectionately Inscribed

TO

HENRY BULLAR,

(of the western circuit)

PREFACE

В том же тексте я хочу получить результат как

(of the western circuit)

и больше ничего не следует снимать. Я использую это, но его не работает:

 

[^\(

\)]*

Пожалуйста помоги.

Regex не всегда является хорошим выбором для данных типа xml / html. В частности, большое значение имеют атрибуты, чувствительность к регистру, комментарии и т. Д.

Для xhtml я бы использовал XmlDocument / XDocument и запрос xpath.

Для «non-x» html я бы посмотрел на HTML Agility Pack и тот же.

Матч-группа одна из:

 (?:

(?:(?!< \/?p>).?)+)(

)

соответствует второй

в:

 

(of the western circuit)

PREFACE

Примечание. Обычно я один из тех, кто говорит: «Не делайте HTML с регулярным выражением, вместо этого используйте парсер». Но я не думаю, что конкретная проблема может быть решена с помощью синтаксического анализатора, который, вероятно, просто игнорирует / прозрачно обрабатывает недействительную разметку.

Я знаю, что это вряд ли (или даже html-legal?) Произойдет в этом случае, но общее закрытое решение xml-тега будет довольно сложно, так как вам нужно подумать о том, что произойдет с вложенными тегами, например

 

OUTER BEFORE

INNER

OUTER AFTER

Я уверен, что регулярные выражения, заданные так далеко, будут соответствовать второму

там, хотя это фактически не закрытое

.

Вместо использования * для максимального соответствия используйте *? для минимального.

Должна быть в состоянии начать с

 

((?!

).)*?

Это использует отрицательное выражение для проверки, чтобы конечный тег не соответствовал каждой точке между совпадениями «

».

EDIT: исправлено, чтобы выразить утверждение (спасибо комментатору).

Все предлагаемые решения соответствуют второму

, но это неправильно. Что делать, если есть два последовательных элемента

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

 @"

(?:[^< ]+|<(?!/?p>))*)(?=

Что касается остальной части, я использовал технику «не первоначальная или не остальная» вместе с атомной группой, чтобы максимально эффективно подгонять регулярное выражение к матчу (и, что более важно, потерпеть неудачу как можно быстрее, если это собираюсь).