Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Горячая тема (более 10 ответов) Проблема взаимопонимания с регулярными выражениями (число прочтений - 7985 )
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Проблема взаимопонимания с регулярными выражениями
15. Марта 2009 :: 19:22
Печать  
Вот мучаюсь с объектом VBScript.RegExp, конкретно вот что делаю
Код
Выбрать все
Pattern = "(\s|^|,)(ВЫБРАТЬ|ИЗ|КАК)\s"; 



Предполагается что надо найти все слова в списке перед которыми или начало строки, или пробел (таб), или символ "," при том что они заканчиваются на этот самый пробел (таб).

Даю текст:
Код
Выбрать все
ВЫБРАТЬ
Спр.ID КАК ТекущийЭлемент
ИЗ
Справочник.Контрагенты 



Собственно Глоб = -1, Многостр = -1, ИгнорироватьРегистр = -1.
Но в итоге ничего не находит...

Подскажите что делаю не так?  Смущённый

Пы.Сы.  хорошая ссылка для конструктора рег. выражений
http://regexpres.narod.ru/calculator.html
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #1 - 16. Марта 2009 :: 10:18
Печать  
1. ИМХО Символ начало строки может быть только в самом начале рег.выражения Печаль
2. Наверное, в начале строки может быть несколько пробелов или символов табуляции - юзай \s*
Поэтому составляй нужное выражение из нескольких подвыражений.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #2 - 16. Марта 2009 :: 10:34
Печать  
Вот, юзай простой вариант
Цитата:
(^[^\wа-яё]*(ВЫБРАТЬ|ИЗ|КАК)[^\wа-яё]+)|([^\wа-яё]+(ВЫБРАТЬ|ИЗ|КАК)[^\wа-яё]+)
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #3 - 16. Марта 2009 :: 19:28
Печать  
artbear писал(а) 16. Марта 2009 :: 10:34:
Вот, юзай простой вариант
Цитата:
(^[^\wа-яё]*(ВЫБРАТЬ|ИЗ|КАК)[^\wа-яё]+)|([^\wа-яё]+(ВЫБРАТЬ|ИЗ|КАК)[^\wа-яё]+)



Спасибо за набросок. Счас его дорабатываю избавляюсь от пробелов и переносов строк и т.п. чтобы слова стали "чистыми"  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #4 - 17. Марта 2009 :: 04:16
Печать  
А зачем дорабатывать-то, убирая пробелы ?
Вариант ([^\wа-яё]+(ВЫБРАТЬ|ИЗ|КАК)[^\wа-яё]+)
автоматом выбирает нужное слово SQL Улыбка

Тем более, что мы знаем, что после этих слов в тексте запроса обязательно должно что-то быть написано, иначе ошибка.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #5 - 17. Марта 2009 :: 13:59
Печать  
У меня счас нет под рукой базы, я когда до нее доберусь попытаюсь объяснить что там у меня "пошло не так"  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #6 - 17. Марта 2009 :: 17:07
Печать  
vandalsvq писал(а) 17. Марта 2009 :: 13:59:
У меня счас нет под рукой базы, я когда до нее доберусь попытаюсь объяснить что там у меня "пошло не так"  Подмигивание


В общем есть одна проблемка в твоем примере, он не хватает два подряд идущих "ключевых" слова... например

Паттерн = .....ЛЕВОЕ|ВНУТРЕННЕЕ|СОЕДИНЕНИЕ......
А текст запроса в свою очередь ЛЕВОЕ СОЕДИНЕНИЕ
Тогда он схватит ЛЕВОЕ а СОЕДИНЕНИЕ пропустит... видимо я хоть и немного стал понимать в Регэксп но как побороть не знаю  Печаль

Пы.Сы. пока просто по второму кругу прогоняю и все съедает  Озадачен
« Последняя редакция: 17. Марта 2009 :: 18:10 - vandalsvq »  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #7 - 18. Марта 2009 :: 11:04
Печать  
Так и говорил бы, что тебе нужно выбрать все ключевые слова Скуля, а не только приведенный пример Улыбка
Тогда вот тебе еще рабочий шаблон
Цитата:
(^[^\wа-яё]*(ВЫБРАТЬ|ИЗ|КАК|ЛЕВОЕ\s+СОЕДИНЕНИЕ)[^\wа-яё]+)|([^\wа-яё]+(ВЫБРАТЬ|ИЗ|КАК|ЛЕВОЕ\s+СОЕДИНЕНИЕ)[^\wа-яё]+)

Как подставить другие виды соединений и "Объединить все", думаю, догадаешься Улыбка

PS на самом деле здесь есть бяка - будет выбираться выражение "Выбрать *" Печаль
Уверен, что это небольшая проблема.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #8 - 18. Марта 2009 :: 11:43
Печать  
Ну я Артур подумал что и в моем прогоне (дважды) тоже правда есть, конструкций может быть много и можно написать например
Код
Выбрать все
ВЫБРАТЬ ЦИКЛ КОГДА Спр.Пометка = 1 ТОГДА 'Да' ИНАЧЕ 'Нет' КОНЕЦ КАК СловоПометка ИЗ Справочник.Контрагенты КАК Спр 


В итоге получится строка из трех слов, где после первого прогона уберется каждое нечетное, а после второго и остатки. Улыбка Так что вроде правда есть.
Счас вот я уже прошел функции, там в общем то не сложно было и проблем вроде нет. (ну СУММА,КОЛИЧЕСТВО и пр.)
Типизация значений пока под вопросом, можно избавится от необходимости писать $ но смысла в этом особого нет да и неоднозначностей мне кажется добавит.
Четвертый пункт - таблицы источники. Вроде получилось. Тоже не самай большая проблема.
Счас для меня следующий пункт программы - реквизиты вроде "Наименование", "Код" у справочника, "Проведен", "ДатаДокумента", "ВремяДокумента" у документа... НО тут проблема
Наименование и Код как реквизит можно завести у документа, но ведь они не должны обрабатываться, т.е. надо проверять источник и тогда только решать либо Наименование->Descr либо нет.
Ну вот как то так.

Пы.сы... Вспомнилось обсуждение когда Ужасть хотел сделать нечто пободное для связки SQL->DBF, я же пытаюсь сделать SQL->SQLite... надеюсь не упереться в стенку в процессе работы... пока вроде работает.
Хочется какой-то близкий к 8-ке язык запросов, т.к. уж больно не охото некоторых заставлять изучать базу данных. А если подобная надстройка позволит в общем то писать "похожим" образом для некоторых задач можно запросто ее применять. Вот...
Попробуйте меня отговорить пока я не закопался  Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #9 - 18. Марта 2009 :: 11:57
Печать  
Я, правда, не вижу, каким образом съедается одно слово.
На моих тестах нет проблем, все ключевые слова выбираются подряд, без пропусков Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #10 - 18. Марта 2009 :: 18:52
Печать  
Артур, я когда доделаю все до конца в КОП (работы правда много) обязательно его выложу. А сырой вариант я думаю мало кому интересно.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #11 - 19. Марта 2009 :: 07:18
Печать  
Теперь вопрос в другом возникает...
Виртуальные таблицы. Улыбка
Ушел думать  Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #12 - 19. Марта 2009 :: 09:20
Печать  
Есть же готовые КОП-ы для разбора выражений Скл. Steban вроде как-то выкладывал как рза для разбора ВТ.
JonnyDeath вроде также руку прикладывал Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #13 - 19. Марта 2009 :: 11:37
Печать  
artbear писал(а) 19. Марта 2009 :: 09:20:
Есть же готовые КОП-ы для разбора выражений Скл. Steban вроде как-то выкладывал как рза для разбора ВТ.
JonnyDeath вроде также руку прикладывал Улыбка


Я наработки тов. Steban использовал для разбора конструкции "$ПоследнееЗначение.ххх.ххх(ххх,ххх)" так что паттерн и разбор есть, я говорю о том что в ODBC есть вирт таблицы, а вот в sqlite нет, точнее вроде кто-то писал надо найти... вот я и думаю... + в AccountRecordset - очень большая работа проделана по ВТ по бухгалтерии.

Надо значится пытаться писать самостоятельно их. Но я как гляну в AccountRecordset так глаза на лоб лезут.

Поэтому пожалуй счас добью парсинг всех полей таблиц (т.е. чтобы не писать ID а писать ТекущийЭлемент, не писать IDDOC а писать ТекущийДокумент и т.д.)... потом напишу мини FAQ... а дальше уже буду вирт. таблицами заниматься
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #14 - 19. Марта 2009 :: 12:25
Печать  
vandalsvq писал(а) 19. Марта 2009 :: 11:37:
Поэтому пожалуй счас добью парсинг всех полей таблиц (т.е. чтобы не писать ID а писать ТекущийЭлемент, не писать IDDOC а писать ТекущийДокумент и т.д.)... потом напишу мини FAQ... а дальше уже буду вирт. таблицами заниматься

А если в конфигурации будут реквизиты с именами "ТекущийЭлемент" и "ТекущийДокумент"? ИМХО, зря ты это затеял.
Про ВТ. Вот здесь лежит класс steban-a, немного мною дополненный (в свете последних изменений 1sqlite, там надо будет ВТ "Последнее значение" немного подправить)
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #15 - 19. Марта 2009 :: 18:32
Печать  
JohnyDeath писал(а) 19. Марта 2009 :: 12:25:
vandalsvq писал(а) 19. Марта 2009 :: 11:37:
Поэтому пожалуй счас добью парсинг всех полей таблиц (т.е. чтобы не писать ID а писать ТекущийЭлемент, не писать IDDOC а писать ТекущийДокумент и т.д.)... потом напишу мини FAQ... а дальше уже буду вирт. таблицами заниматься

А если в конфигурации будут реквизиты с именами "ТекущийЭлемент" и "ТекущийДокумент"? ИМХО, зря ты это затеял.
Про ВТ. Вот здесь лежит класс steban-a, немного мною дополненный (в свете последних изменений 1sqlite, там надо будет ВТ "Последнее значение" немного подправить)


Я думал над этой проблемой и решил ее следующим образом...
1. Получаю конструкцию (\$[\wа-я]+)\.([\wа-я]+) из нее получаю
- все выражение
- конструкцию $xxxxx и конструкцию после точки
2. Ищу в тексте конструкцию ИЗ или СОЕДИНЕНИЕ Тип.Вид КАК xxxxx
3. Оттуда соответственно получаю тип и вид и исходя из этого либо парсю (меняю на ID и т.п.) либо оставляю как есть... Не находит конструкцию оставляет как есть
Пока проблем не выявил и вроде пробовал и в спр. делал реквизит ТекущийДокумент, и в Док. делал ТекущийСправочник, Наименование и т.п....

Есть "Но" есть проблемы... но меня ими мало напугать можно. По крайней мере пока к стенке не прижмусь  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #16 - 20. Марта 2009 :: 07:51
Печать  
vandalsvq писал(а) 19. Марта 2009 :: 18:32:
пробовал и в спр. делал реквизит ТекущийДокумент, и в Док. делал ТекущийСправочник, Наименование и т.п....

хитрый  Улыбка
а в справочнике сделать реквизит ТекущийЭлемент и в документе "ТекущийДокумент"?
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #17 - 20. Марта 2009 :: 09:10
Печать  
Я правильно понял, что ты хочешь сделать некий обобщенный язык запросов и потом транслировать его в язык запросов конкретного движка (Fox SQL, TSQL, sqlite)?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #18 - 20. Марта 2009 :: 09:21
Печать  
Я бы подошел к такой задаче с другой стороны..

Регекспы не сильно удобны при разборе грамматик.
Например, нужно учесть, что запросы или выражения бывают вложенными. В общем виде такое при помощи регулярных выражений не решается. Можно решить для ограниченного количества уровней вложенности, но шаблоны при этом становятся страшными крокодилами - вот например шаблон для выделения одного параметра ВТ:
Код
Выбрать все
((?:\((?:[^()]|""[^""]*""|'[^']*'|\((?:[^()]|""[^""]*""|'[^']*'|\((?:[^()]|""[^""]*""|'[^']*'|\([^()]*\))*\))*\))*\)|""[^""]*""|'[^']*'|[^,()""'])*) 



Советую посмотреть в сторону Parsing expression grammars (PEGs). Такой подход позволит тебе описав грамматику твоего языка, получать дерево синтаксического разбора, а из этого дерева гораздо проще будет получить текст на выходном языке.
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #19 - 20. Марта 2009 :: 09:24
Печать  
Для PEG есть красивая и быстрая реализация в виде либы для Lua - LPeg.
А с Lua в 1с мы работать уже умеем Подмигивание
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #20 - 20. Марта 2009 :: 09:42
Печать  
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Проблема взаимопонимания с регулярными выражениями
Ответ #21 - 20. Марта 2009 :: 11:44
Печать  
Цитата:
Я правильно понял, что ты хочешь сделать некий обобщенный язык запросов и потом транслировать его в язык запросов конкретного движка (Fox SQL, TSQL, sqlite)?


Да именно это я счас и делаю. Только вот для SQL - TSQL, для DBF - SQLite. А с FOXом я пока не дружу.. как то не сложилось пока  Улыбка

На счет общих правил и что можно решить регэкспом...
Я посмотрел решение ВТОстатки на sqlite и AccountRecordset и... да... шаблон там нихренанечитаемый на первый взгляд. В целом вроде я все решил, правда конечно остается место для "финта ушами". Пока конечно обхожусь. Тут даже не переводе в язык проблем больше а с учетом особенностей языков. И соответственно рождаются различные ограничения. Вроде того что обязательно надо писать
Код
Выбрать все
ВЫБРАТЬ [b]$Спр.[/b]ТекущийЭлемент ИЗ Справочник.Контрагенты [b]КАК Спр[/b] 


иначе полезут ошибки. В общем я на суд общественности отдам тогда когда хотя бы ВТ по регистрам впихну туда.
Ну а если упрусь в стену то... посмотрим.

А то что ты предложил я почитаю и посмотрю.  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать