Тема: Удалить форматирование текста

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

Public Function freeFormat(sText As String) As String
Dim rega As RegExp, regb As RegExp, ama, amb, bma, bmb
freeFormat = ""
Set rega = New RegExp
Set regb = New RegExp
rega.Global = True
regb.Global = True
rega.IgnoreCase = True
regb.IgnoreCase = True
rega.Pattern = "([^{]*){([^}]*)}([^{]*)"
Set ama = rega.Execute(sText)
If ama.Count > 0 Then
    For Each amb In ama
        freeFormat = freeFormat & amb.SubMatches(0)
        regb.Pattern = "([^\\]*)\\[^\\]*;([^\\]*)"
        Set bma = regb.Execute(amb.SubMatches(1))
        For Each bmb In bma
            freeFormat = freeFormat & bmb.SubMatches(0) & bmb.SubMatches(1)
        Next
        freeFormat = freeFormat & amb.SubMatches(2)
    Next
End If
End Function

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

Re: Удалить форматирование текста

> zagzag2003
Очень нужная функция, к сожалению у меня
не работает на такой строке:

{\fSimplex|b1|i0|c0|p34;\LGENERAL NOTES LINE1:}
{\fArial|b1|i0|c0|p34;\LGENERAL NOTES LINE2:}

Есть какие идеи?
~'J'~

Re: Удалить форматирование текста

Да, действительно эта проблема есть. Ключ \L - это подчеркивание, он, как и ключ \O (надчеркивание), не имеет замыкающего ";". Попробую поварьировать маской...
На всякий случай распишу использованные маски:
Первая маска - выделение содержимого фигурных скобок.
([^{]*) - всё, что до фигурной скобки;
{ - она;
([^}]*) - всё, кроме закрывающей ф.скобки;
} - замыкающая;
([^{]*) - всё, что после неё, до следующей открываюшей фигурной скобки.
Вторая маска - попытка выделить текст из бардака, который в фигурных скобках.
([^\\]*) - всё до символа \;
\\ - он появился;
[^\\]*; - всё от \ до последней ";". Это получается пара: открывается через "\", закрывается через ";"
([^\\]*) всё до следующей "\" или до закрывающей фигурной скобки. Это и есть главное - чистый текст.

Re: Удалить форматирование текста

Вот сейчас уже ловит эти ключи. Во второй маске легко найти место, где вставлять другие варианты одинарных ключей.

Public Function freeFormat(sText As String) As String
Dim rega As RegExp, regb As RegExp, ama, amb, bma, bmb
freeFormat = ""
Set rega = New RegExp
Set regb = New RegExp
rega.Global = True
regb.Global = True
rega.IgnoreCase = True
regb.IgnoreCase = True
rega.Pattern = "([^{]*){([^}]*)}([^{]*)"
Set ama = rega.Execute(sText)
If ama.Count > 0 Then
    For Each amb In ama
        freeFormat = freeFormat & amb.SubMatches(0)
        regb.Pattern = "([^\\]*)((\\[LO])|(\\[^\\]*;))*([^\\]*)"
        Set bma = regb.Execute(amb.SubMatches(1))
        For Each bmb In bma
            freeFormat = freeFormat & bmb.SubMatches(4)
        Next
        freeFormat = freeFormat & amb.SubMatches(2)
    Next
End If
End Function

Смею предложить свой же инструмент для проверки регулярных выражений - он мне ооооочень помог, честно.
http://www.novoselitsa.cv.ua/dnepr/note … exphta.zip

Re: Удалить форматирование текста

> zagzag2003
Большой респект за лекцию и решение,
теперь работает, по-крайней мере с
тем форматирванием, которое у меня встречается
Позволю себе наглость дать небольшой совет:
лучше всего готовые решения и ссылки давать
в раздел "Готовые программы" здесь:
https://www.caduser.ru/forum/forum44.html
там легче для пользователей их обнаружить
Успехов и ждем новых решений
~'J'~

Re: Удалить форматирование текста

Спасибо за совет, поместил вот сюда:
https://www.caduser.ru/forum/topic43895.html