Захват части строки, которая не соответствует другой группе (C # Regex) - PullRequest
0 голосов
/ 05 декабря 2009

Я работаю над проектом, который требует анализа "форматирования тегов". Используя тег вроде этого: <b>text</b>, он изменяет внешний вид текста (этот тег делает текст жирным). В одном теге может быть до 4 идентификаторов (b для жирного шрифта, i для курсива, u для подчеркивания и s для вычеркивания).

Например:

<bi>some</b> text</i> here даст некоторый текст здесь.

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

<(?<open>[bius]{1,4})>(?<text>.+?)</(?<close>[bius]{1,4})>

Соответствует одному тегу, приложенному тексту и одному соответствующему закрывающему тегу.

Прямо сейчас я перебираю каждый отдельный символ и пытаюсь сопоставить позицию в строке, в которой я нахожусь, до конца строки, например, Я пытаюсь сопоставить всю строку в i = 0, подстроку с позиции 1 до конца в i = 1 и т. Д.

Однако такой подход невероятно неэффективен. Похоже, что было бы лучше сопоставить всю строку в одном RegEx, а не выполнять ручную итерацию по строке.

Мой актуальный вопрос: можно ли сопоставить строку, которая не соответствует группе, например тег? Я прогуглил это без успеха, но, возможно, я не использовал правильные слова.

Ответы [ 3 ]

1 голос
/ 05 декабря 2009

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

Вместо этого я бы порекомендовал сначала разбить входные данные на отдельные теги и текст между тегами. Вы можете использовать простое регулярное выражение для поиска отдельных тегов - это гораздо более простая проблема, с которой регулярные выражения могут справиться достаточно хорошо. После того, как вы его токенизировали, вы можете перебирать токены с помощью обычного цикла и применять форматирование к тексту соответствующим образом.

0 голосов
/ 05 декабря 2009

Почему бы вам не использовать парсер HTML для этого ?

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

Никогда не используйте регулярные выражения или синтаксический анализ строк для обработки XML . Каждый распространенный язык сейчас имеет отличную поддержку XML. XML - обманчиво сложный стандарт, и вряд ли ваш код будет правильным в том смысле, что он будет правильно анализировать все правильно сформированные входные данные XML, и даже если это так, вы тратите свое время, потому что (как только что упоминалось) каждый язык в общее использование имеет поддержку XML. Использовать регулярные выражения для разбора XML непрофессионально.

0 голосов
/ 05 декабря 2009

Попробуйте префикс вашего регулярного выражения с ^(.*?) (совпадать с любыми символами в начале строки, не жадные). Таким образом, он будет совпадать с чем угодно, что происходит в начале строки, но он будет совпадать настолько мало, насколько это возможно, оставаясь при этом с остальным соответствием регулярному выражению. Таким образом, вы получите все вещи, которые обычно не совпадали в этой первой группе захвата.

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