Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Проблема взаимопонимания с регулярными выражениями (число прочтений - 8027 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать