Ассоциация ЭБНИТ    ИРБИС-корпорация    Вики-Ирбис    Online/CHM справка Ирбис    FTP-сервер
Опыт и разработки пользователей ИРБИС :  ИРБИС Irbis
 
Поддержка регулярных выражений в UNIFOR
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 13, March, 2009 14:03

К обсуждению в теме [irbis.gpntb.ru].
В прикрепленных архивах компонент TRegExp и помощь по нему. Есть хорошая демка, показывающая в общем-то все возможности.

Ссылка на сайт проекта [www.regexpstudio.com] любезно предоставлена пользователем unat



Редактировано 2 раз. Последний раз 16.03.2009 09:56 пользователем Панев Максим.

Вложения: regexpr0947.zip (284.3KB)   regexpr_hlp_RU.zip (44.8KB)  
Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 14, April, 2009 00:44

Поддерживаю двумя руками! Действительно регулярных выражений в Unifor’ах очень не хватает. Наличие готового компонента Delphi делает возможность поддержи регулярных выражений вполне реальной.

В качестве "карманов" сразу предлагаю использовать повторения глобальной переменной. Тогда простой конструкцией &uf('Ag1111#1') можно будет обратиться к любому извлечённому значению.

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Alio (IP-адрес скрыт)
Дата: 14, April, 2009 12:24

Как Вы мыслите конструкцию этого unifor?

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Alio (IP-адрес скрыт)
Дата: 14, April, 2009 16:16

Все это можно сделать собственными силами на основе &uf('+8...'). Коли Вам лень - сделал сам (потратил полчаса)
Выложил на открытом FTP - myunifor.dll
в котором реализована функция RegExp_Exec

Вызов через формат

&uf('+8myunifor,RegExp_Exec,',<исходная строка>

Исходная строка должна иметь следующую структуру:

!<регулярное_выражение>!<строка>

где:
! - любой символ-разделитель, отсутствующий в регулярном выражении
<строка> - строка, в которой выполняется поиск

Возврат:
0 - не найдено
1 - найдено


Myunifor.dll должен лежать и на сервере и у клиента.



Редактировано 1 раз. Последний раз 14.04.2009 16:17 пользователем Alio.

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Панев Максим (IP-адрес скрыт)
Дата: 14, April, 2009 17:25

Александр Иосифович. Приложите, пожалуйста, исходный код этой dll. У меня есть несколько идей по улучшению.

PS. А почему вы не хотите добавить эту функцию в стандартную поставку unifor? Понятно, что можно внешней dll-кой сделать, но не очень хочется ее всегда при необходимости таскать.



Редактировано 1 раз. Последний раз 14.04.2009 17:26 пользователем Панев Максим.

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Alio (IP-адрес скрыт)
Дата: 14, April, 2009 18:15

Панев Максим написал(а):
-------------------------------------------------------
> PS. А почему вы не хотите добавить эту функцию в
> стандартную поставку unifor? Понятно, что можно
> внешней dll-кой сделать, но не очень хочется ее
> всегда при необходимости таскать.

Потому что используется сторонняя компонента, за которую ни я, никто другой не несет никакой ответственности

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 15, April, 2009 00:29

Александр Иосифович, спасибо, что откликнулись на наши просьбы!

Вы конечно правы относительно того, что поведение чужого кода непредсказуемо. Но, может быть, после тестирования его всё-таки допустимо будет включить его в стандартную поставку? Как справедливо отметил Максим, функция имеет значение для ИРБИС в целом, а не для одной или двух организаций и переносить библиотеку будет не удобно. Кроме того, использование специального UNIFOR позволит существенно упростить синтаксис, который для этой функции в любом случае получится достаточно сложным.

Что касается конструкции UNIFOR, я думаю, её главной функцией будет всё же выделение нужных фрагментов. Поэтому возможность использования найденных элементов будет иметь определяющее значение.

Мне кажется вполне подходящей следующая схема:

&uf([идентификатор конкретного UNIFOR][ограничитель регулярного выражения][регулярное выражение][ограничитель регулярного выражения][исходная строка][разделитель][номер переменной с «карманами»])

 Например: &uf(‘RE{([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?}Иванов Т.Х.#999’)

Здесь:
1. идентификатор конкретного UNIFOR – RE
2. ограничитель регулярного выражения – {
3. регулярное выражение – ([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?
4. исходная строка – Иванов Т.Х.(в реальных условиях она не будет предзадана)
5. номер переменной с «карманами» – 999 (опциональный элемент. Может отсутствовать)

Функция возвращает :
0 - если ничего не найдено(хотя лучше бы в этом случае она вообще ничего не возвращала)
1 - если найдено найдено


Данное выражение позволит получить:
1. Фамилию: &uf(‘Ag999#1’) – в данном случае «Иванов»
2. Первый инициал: &uf(‘Ag999#2’) – в данном случае «T»
3. Второй инициал инициал: &uf(‘Ag999#2’) – в данном случае «Х»

Допустим, выделение элементов ФИО требуется для простановки запятой после фамилии и пробела между инициалами. Тогда весь код будет выглядеть так:
if &uf(‘RE{([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?}Иванов Т.Х.#999’)=’1’ then 
&uf(‘Ag999#1’), ‘,  ‘&uf(‘Ag999#2’)’.  ‘&uf(‘Ag999#3’)’. ‘
fi,

Сегодня для той же цели используется гораздо более сложный код:
(if p(v330^3) then|A=|d330^3,if p(v330^>) then if v330^>:'1' then v330^3 else &unifor('E'v330^>,v330^3),|, |v330^;,if a(v330^;) then if &unifor('F'v330^>,v330^3)<>'' then ', 'if &unifor('F'v330^>,v330^3):'. ' then &unifor('F'v330^>,v330^3) else if &unifor('F'v330^>,v330^3):'.'then &unifor('G0.'&unifor('F'v330^>,v330^3)),'. '&unifor('G2.'&unifor('F'v330^>,v330^3)) else &unifor('F'v330^>,v330^3) fi fi fi fi fi else if v330^3:',' then &unifor('G0,'v330^3),else &unifor('G0 'v330^3) fi,|, |v330^;,if a(v330^;) then if &unifor('G2 'v330^3):'. ' then ', '&unifor('G2 'v330^3) else if &unifor('G2 'v330^3):'.'then ', ' &unifor('G0.'&unifor('G2 'v330^3)),'. '&unifor('G2.'&unifor('G2 'v330^3)) fi fi fi fi,|\|v330^t*4|\| fi,|/) 

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Кирилл Соколинский (СЗТУ) (IP-адрес скрыт)
Дата: 15, April, 2009 01:19

PS
Нашел сайт компонента с русским руководством:
[www.autocombats.info]
Насколько я мог заключить, у него уже неплохой послужной список.
:)



Редактировано 1 раз. Последний раз 15.04.2009 01:37 пользователем Кирилл Соколинский (СЗТУ).

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Alio (IP-адрес скрыт)
Дата: 15, April, 2009 11:15

Добавил в Myunifor.dll еще две функции

RegExp_Split
RegExp_SubExp

с той же структурой входной строки.

В этом случае &uf('+8...) возвращает список строк (который можно "посадить" на любую глобальную переменную)

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



Редактировано 1 раз. Последний раз 15.04.2009 11:44 пользователем Alio.

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: Alio (IP-адрес скрыт)
Дата: 15, April, 2009 12:43

Кирилл Соколинский (СЗТУ) написал(а):
-------------------------------------------------------
> Например:
&uf(‘RE{([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?}Иванов Т.Х.#999’)

Ваш пример реализуется следующим образом

&uf('+7W1#',&uf('+8myunifor,RegExp_SubExp,!([A-я\-]+)\,? ([A-я\-]*)\.? ?([A-я\-]*)\.?!Иванов Т.Х.')),
(g1/)



Редактировано 2 раз. Последний раз 15.04.2009 12:49 пользователем Alio.

Re: Поддержка регулярных выражений в UNIFOR
Пользователь: iLq (IP-адрес скрыт)
Дата: 19, May, 2009 13:26

Спасибо большое! Супер!



Извините, только зарегистрированные пользователи могут писать в этом форуме.
This forum powered by Phorum.