Использование регулярных выражений при работе с типом String

Автор karpo518, 14 ноября 2016, 19:33

0 Пользователи и 1 гость просматривают эту тему.

karpo518

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

Но с этими документами нужно работать, поэтому хотелось бы работать со строкой в переменной, а потом класть её в документ с помощью текстового курсора. Подскажите, есть ли возможность в макросе искать и заменять содержимое переменной типа String с помощью регулярных выражений. Если есть, уточните, как это сделать. На просторах интернета не нашёл такого синтаксиса.
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

JohnSUN

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

mikekaganski

С уважением,
Михаил Каганский

karpo518

ЦитироватьА макрос на 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


karpo518

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