Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

15 Май 2021, 07:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Использование регулярных выражений при работе с типом String  (Прочитано 2858 раз)
0 Пользователей и 1 Гость смотрят эту тему.
karpo518
Форумчанин
***
Offline Offline

Сообщений: 51


« Стартовое сообщение: 14 Ноябрь 2016, 19:33 »

Всем привет. Требуется парсинг параграфов в документе Writer. Ранее на некоторых документах была проблема с createsearchdescriptor и createreplacedescriptor. В таких документах не удавалось ничего найти. Подозреваю, что они созданы в устаревших или несовместимых приложениях.

Но с этими документами нужно работать, поэтому хотелось бы работать со строкой в переменной, а потом класть её в документ с помощью текстового курсора. Подскажите, есть ли возможность в макросе искать и заменять содержимое переменной типа String с помощью регулярных выражений. Если есть, уточните, как это сделать. На просторах интернета не нашёл такого синтаксиса.
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 764


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #1: 14 Ноябрь 2016, 23:03 »

Это здесь
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 080


« Ответ #2: 15 Ноябрь 2016, 05:37 »

А макрос на Python не позволяет того, что Вам нужно?

Начать с
Код:
import re

https://docs.python.org/3/library/re.html
Записан

С уважением,
Михаил Каганский
karpo518
Форумчанин
***
Offline Offline

Сообщений: 51


« Ответ #3: 15 Ноябрь 2016, 09:49 »

Цитата:
А макрос на Python не позволяет того, что Вам нужно?
Скорее всего может, но макрос уже написан на VB

JohnSUN, спасибо за пример. При использовании функции возникает ошибка:

Ошибка времени выполнения BASIC.
Свойство или метод не найдены: searchForString.


LibreOffice 4.2.8.2, Linux Mint 17.3

Не знаете, в чём может быть проблема?
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 3 071


iMac, LibreOffice и Apache OpenOffice


« Ответ #4: 15 Ноябрь 2016, 10:17 »

Свойство или метод не найдены: searchForString.
For — убрать из searchForString
Записан

karpo518
Форумчанин
***
Offline Offline

Сообщений: 51


« Ответ #5: 15 Ноябрь 2016, 13:37 »

rami, спасибо. Помогло. Хочу сделать из этой функции универсальный инструмент, как для замены вхождения, так и для поиска. Пока сделал такой вариант:

Код:
Function RegExSubst(targetStr as string, searchForStr as string, replaceStr, flags as integer) As String
Dim options as new com.sun.star.util.SearchOptions
options.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
flagOp = ""
if (flags and 1) = 1 then
flagOp = "i"
end if
flagStr = ""
if len(flagOp) > 0 then
flagStr = "(?" & flagOp & ")"
end if
options.searchString = flagStr & searchForStr
ts = CreateUnoService("com.sun.star.util.TextSearch")
ts.setOptions(options)
r = ts.searchForward(targetStr, 0, Len(targetStr))
if r.subRegExpressions = 0 then
if IsNull(replaceStr) then
RegExSubst = False
else
RegExSubst = targetStr
end if
else
if IsNull(replaceStr) then
RegExSubst = True
else
subCount = r.subRegExpressions
replaceText = replaceStr
i = 0
start = 1
Do
ref = "\" & CStr(i)
    n = InStr(start, replaceText, ref)
if n > 0 then
refStr = mid(targetStr, r.startOffset(i) +1, r.endOffset(i) - r.startOffset(0))
replaceText = left(replaceText, n-1) & refStr & right(replaceText, len(replaceText) -(n + len(ref))+1)
start = n + len(replaceText)
else
i = i + 1
end if
Loop While i < subCount
   
RegExSubst = left(targetStr, r.startOffset(0)) & replaceText & mid(targetStr, r.endOffset(0) +1, 65535)
end if
end if
End Function

Для поиска вместо строки для замены нужно передавать в функцию null. Есть замечания по такому алгоритму?
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!