Использование RegExp в OO Calc

Создание карты участковых избирательных комиссий
Ответить
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3367
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 514
Ваше звание: Author
Контактная информация:

Использование RegExp в OO Calc

Сообщение Denis Rykov » 26 авг 2013, 15:22

После неудачных попыток извлечь подстроку из одной ячейки в другую с использованием регулярных выражений набрел на эту тему. Оказывается, что обойтись штатными функциями не получится, но можно написать простой макрос. Для этого выбираем Tools -> Macros -> Organize Macros -> LibreOffice Basic и создаем новый макрос:

Код: Выделить всё

REM  *****  BASIC  *****

Function regex(a,b,c)

' Attention - made by novice, so can contain bugs

' a - string or cell to search in
' b - regexp string or cell containing regexp string
' c - back-reference number - analogy to \n in regexp syntax


' prepare regexp search options
oTextSearch = CreateUnoService("com.sun.star.util.TextSearch")
oOptions = CreateUnoStruct("com.sun.star.util.SearchOptions")
oOptions.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
oOptions.searchString = b
oTextSearch.setOptions(oOptions)

' search first substring
oFound = oTextSearch.searchForward(a, 0, Len(a))

If oFound.subRegExpressions=0 then
regex = "No result in that back-reference level"
Exit Function
Else
nStart = oFound.startOffset()
nEnd = oFound.endOffset()
regex = Mid(a, nStart(c) + 1, nEnd(c) - nStart(c))
End If

End Function
Затем используем его в качестве функции, например, если в ячейке D3 содержится текст:
г.Рубцовск, ул.Пролетарская (здание средней общеобразоват. школы № 13), д.412А
то выполнив в другой ячейке команду:

Код: Выделить всё

=REGEX(D3;"\((.*?)\)";0)
получим:

Код: Выделить всё

(здание средней общеобразоват. школы № 13)
В принципе мне этого оказалось достаточным, но как получить значение именно внутри скобок я так и не понял, хотя регулярка вроде правильная.
Spatial is now, more than ever, just another column- The Geometry Column.

sadless74
Завсегдатай
Сообщения: 282
Зарегистрирован: 25 май 2009, 13:50
Проекты: 2
Репутация: 40

Re: Использование RegExp в OO Calc

Сообщение sadless74 » 27 авг 2013, 05:30

Скобки которые символы обозначаются \( или \) то есть экранированы слэшем.
а то что в обычных скобках (.*)\,(.*) нумеруется \1,\2 и может переставляться. Например
привет, пока это (.*)\,[ ](.*) или \1, \2 а можно переставить \2, \1 и будет пока, привет

В SciTE тоже использую RegExp для подобных действий у меня бы выглядело это так:
строка г.Рубцовск, ул.Пролетарская (здание средней общеобразоват. школы № 13), д.412А
нажимаю Ctrl+H
В поле Найти: \((.*?)\)
В поле Заменить: \1
Нумерованный элемент \1 обозначает то что заключается в простых скобках (.*?)
и останется:
здание средней общеобразоват. школы № 13

Хотя так смысла немного.
Можно сделать:
строка г.Рубцовск, ул.Пролетарская (здание средней общеобразоват. школы № 13), д.412А
нажимаю Ctrl+H
В поле Найти: (.*)\,(.*) \((.*?)\)\,(.*)
В поле Заменить: \1,\2,\4;\3
и получу строку: г.Рубцовск, ул.Пролетарская, д.412А;здание средней общеобразоват. школы № 13
которую можно вставить как Текст без форматирования в OOCalc разделитель ;
и получится два столбца из одного...

P.S. удобно сформировать текcт с разделителями. загрузить в OOCalc. затем вытащить отдельный столбец.
снова его в текстовый редактор. обработать как надо, что-то поменять местами или вытащить в отдельный столбец.
затем снова вернуть в OOCalc

Ответить

Вернуться в «УИК ГЕО»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость