Поиск конкретного слова, в котором может быть тег RTF - PullRequest
0 голосов
/ 21 августа 2011

В настоящее время я пишу программу, которая форматирует определенные слова в документе Rich Text, помещая RTF-теги вокруг них.

Поскольку в программе предусмотрены дополнительные правила форматирования, которые могут перекрываться (т. Е. Раскрасить фразу «пожалуйста, помогите мне» все в желтый и раскрасить «пожалуйста» в синий), программе сложно найти совпадения, которые уже были отформатированы по предыдущему правилу (т. е. «пожалуйста, помогите мне» , из предыдущего примера становится " \ cf1 , пожалуйста \ cf0 помогите мне ", что не будет соответствовать другому правилу.

Я обходил это, используя регулярные выражения и помещая выражение, которое соответствует любому тегу RTF после каждого символа в фразе (так как правила определены пользователем, и я не знаю конкретной точки перекрытия), как это :

line = Regex.Replace(line, @"\bP(?:\\[^ ]* )*l(?:\\[^ ]* )*e(?:\\[^ ]* )*a(?:\\[^ ]*   )*s(?:\\[^ ]* )*e(?:\\[^ ]* )*", Evaluator);

Выражение '(?: \\ [^] *) *' в приведенной выше последовательности находит предыдущий символ независимо от каких-либо тегов после него, но выполнение этого с каждым правилом значительно замедляет код и требует от меня создания регулярного выражения для каждый; который может работать не так, как ожидалось, в зависимости от правила.

Эрр, извините за стену текста, я сейчас доберусь до сути. Кто-нибудь знает более эффективный способ найти слово с RTF-тегами внутри него в неизвестной точке?

1 Ответ

0 голосов
/ 21 августа 2011

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

Редактировать

Если вам абсолютно необходимо перекрытие, то создайте стек форматирования. Завершите старый тег, как я сказал выше, но сохраните его в стеке. Запустите новый тег, и когда ваш новый тег будет завершен, если старое форматирование не было закрыто (и все еще находится в стеке), снова запустите старое форматирование. Всякий раз, когда вы закрываете тег, вы удаляете его из стека.

...