Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема паттерн для разбора произвольного условия запроса (число прочтений - 3962 )
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
паттерн для разбора произвольного условия запроса
29. Мая 2009 :: 07:53
Печать  
не совсем уверен, что в тот раздел пишу;
требуется разложить условие запроса на составляющие (тут как я представляю, в итоге д.получиться дерево). Не поможете ли советом, что оптимальнее всего - использование регулярных выражений или какой то иной способ ?
условие запроса имеется в виду такое:
(х=у or Контрагент=:ВыбКонтрагент) and Фирма in (select val from табФирмы) .... и т.д.
  
Наверх
ICQ  
IP записан
 
alexdd
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 347
Зарегистрирован: 25. Июня 2007
Re: паттерн для разбора произвольного условия запроса
Ответ #1 - 30. Мая 2009 :: 16:58
Печать  
почти оффтоп: пытался когда-то сделать что-то такое - хотел сделать в одном отчете, чтобы пользователи могли переключаться с ручного редактирования условия(есть такие продвинутые пользователиУлыбка) на использование конструктора. При переключении на конструктор, чтобы программа могла "понять" что там пользователь понаписывал.
В итоге отказался от этой идеи. Слишком сложно и нафик нужноУлыбка
вот http://www.sqlparser.com/download.php есть готовый парсер с примерами на разных языках
  
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: паттерн для разбора произвольного условия запроса
Ответ #2 - 30. Мая 2009 :: 19:22
Печать  
в принципе, на 1с ничего сложного, написать код, который разложит условие как мне нужно. просто пытался найти красивое решение; пока бьюсь - сочиняю паттерн для RegExp - но что то чую - очень уж сложно получается  Печаль
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: паттерн для разбора произвольного условия запроса
Ответ #3 - 01. Июня 2009 :: 16:04
Печать  
помогите, кто разбирается в регэкспах, я уже голову сломал  Злой

дальше уже упростить не могу. в общем обрабатываю строку

Код
Выбрать все
RegExp = СоздатьОбъект("VBScript.RegExp");
RegExp.IgnoreCase = -1;
RegExp.Global     = -1;

RegExp.Pattern    = "(?:    [^)]*  |  '[^']*'	 )*   [),]";
// на пробелы м. не обращать внимание

СтрокаОбработки= ')))))',
 



и в матчах перечисляются поочередно все скобки

если же переписать паттерн на один из вариантов

Код
Выбрать все
RegExp.Pattern    = "(?:    [^)']*     |  '[^']*'	 )*   [),]";
// или
RegExp.Pattern    = "(?:    |  '[^']*'  |   [^)]*     )*    [),]";
 




то выдается, как и ожидалось,  один матч, вся строка.

Хочу просто понять логику действия этого объекта,
до меня она никак не доходит. поделитесь мыслями
  
Наверх
ICQ  
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: паттерн для разбора произвольного условия запроса
Ответ #4 - 01. Июня 2009 :: 16:47
Печать  
ах - все, понял логику. все нормально  Очень довольный
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: паттерн для разбора произвольного условия запроса
Ответ #5 - 01. Июня 2009 :: 19:58
Печать  
Не скажу, что твою задачу нельзя решить при помощи RegExp. Можно.
Но это примерно как копать яму топором.

Кое-какие соображения по похожей задаче я изложил тут.

И еще одна ссылочка для размышления
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
ol
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 272
Местоположение: Санкт-Петербург
Зарегистрирован: 24. Января 2009
Пол: Мужской
Re: паттерн для разбора произвольного условия запроса
Ответ #6 - 01. Июня 2009 :: 21:23
Печать  
насчет топора - подмечено верно; я уж стал это понимать потихоньку. Теперь двинулся несколько более хитрым путем - написал нужный парсер на языке 1с и пытаюсь его ускорить при помощи регэкспов. Пока добился ускорения что то процентов на 20-30, не особо помогают

А за ссылки спасибо - обязательно посмотрю
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать