powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбор формулы на составляющие с помощью регулярных выражений
15 сообщений из 15, страница 1 из 1
Разбор формулы на составляющие с помощью регулярных выражений
    #40049918
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Помогите правильно распарсить следующую формулу.

Это только пример, кол-во составляющих в формуле может быть сколько угодно много.
Формула: "Данные(Месяц;Год) - Данные(Месяц-3;Год) + Данные(Месяц-1;Год)"

Использовал следующий запрос:

Код: plsql
1.
2.
3.
4.
5.
with t as (select 'Данные(Месяц;Год) - Данные(Месяц-3;Год) + Данные(Месяц-1;Год)' str_text from dual)
select case when level != 1 then  regexp_substr(str_text, '[*+|-]', 1, level - 1) end prefix_sign,
       regexp_substr(str_text, '[^+|-]+', 1, level) str_text,
       regexp_substr(str_text, '[*+|-]', 1, level) postfix_sign from t
CONNECT BY regexp_substr(str_text, '[^+|-]+', 1, level) is not null



Но результат не тот, который я бы хотел получить.
№PREFIX_SIGNSTR_TEXTPOSTFIX_SIGN1Данные(Месяц;Год)-2-Данные(Месяц-3-3;Год)+4+Данные(Месяц-5-1;Год)

Хотелось бы получить следующие данные:
№PREFIX_SIGNSTR_TEXTPOSTFIX_SIGN1Данные(Месяц;Год)-2-Данные(Месяц-3;Год)+3+Данные(Месяц-1;Год)
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40049921
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Корвин74
Помогите правильно распарсить следующую формулу.

Это только пример, кол-во составляющих в формуле может быть сколько угодно много.
Наивный, а кто гарантирует синтаксическую корректность "формул"?
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40049923
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, мне главное правильно разбить на составляющие.
Синтаксическая корректность составляющих будет проверятся на следующем этапе.
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40049928
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Корвин74
главное правильно разбить на составляющие.
PL/SQL для этого подходит гораздо лучше.
Чего вам всем клин на SQL-е сошёлся?
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40049931
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic

Чего вам всем клин на SQL-е сошёлся?


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

Может кто-то подскажет решение малой кровью?
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40049970
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Корвин74
Код: plsql
1.
'[*+|-]'

Кстати, ты внимательно читал лоцию, прежде чем написать подобный "регулярус"?
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40049979
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
Кстати, ты внимательно читал лоцию, прежде чем написать подобный "регулярус"?


А что не так?
Можно и так написать
Код: plsql
1.
'[+|-]'

, результат тот же.
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050004
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Корвин74
результат тот же.
Это пока магия данных. А ты не понимаешь регулярусов.
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050102
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
А ты не понимаешь регулярусов.


Ну да, не гуру. :)
Поэтому и прошу помощи у форума.
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050109
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as (select 'Данные(Месяц;Год) - Данные(Месяц-3;Год) + Данные(Месяц-1;Год)' str_text from dual)
   , s as (select str_text, '(.*?)(\s([+-]\s)|$)' as pattern from t)
select       regexp_substr(str_text, pattern, 1, level, '', 1) as str_text
     ,       regexp_substr(str_text, pattern, 1, level, '', 3) as postfix_sign
  from s
  connect by regexp_substr(str_text, pattern, 1, level)        is not null
;

STR_TEXT                                                      POSTFIX_SIGN
------------------------------------------------------------- ------------
Данные(Месяц;Год)                                             -
Данные(Месяц-3;Год)                                           +
Данные(Месяц-1;Год)

3 rows selected.
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050116
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Корвин74результат тот же.
Это пока магия данных.
Код: plsql
1.
'Данные(Месяц;Год) - Данные(Месяц-3;|Год) + Данные(Месяц-1;Год)'


Корвин74
Поэтому и прошу помощи у форума.
Лучше RTFM Using Regular Expressions in Database Applications
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050137
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, спасибо, попробую применить на реальных формулах.
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050174
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic, в реальности между составляющими формул может не быть пробелов.
И наоборот может быть пробел здесь "Месяц - 3"

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as
 (select 'Данные(Месяц;Год)-Данные(Месяц - 3;Год)+Данные(Месяц - 1;Год)' str_text
    from dual),
s as
 (select str_text, '(.*?)(\s([+-]\s)|$)' as pattern from t)
select regexp_substr(str_text, pattern, 1, level, '', 1) as str_text,
       regexp_substr(str_text, pattern, 1, level, '', 3) as postfix_sign
  from s
connect by regexp_substr(str_text, pattern, 1, level) is not null;
...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050193
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Корвин74
Elic, в реальности между составляющими формул может не быть пробелов.
И наоборот может быть пробел здесь "Месяц - 3"
Так это твои проблемы.
Если ты сможешь сформулировать непротиворечивый алгоритм разбиения на токены, то, возможно, и регулярус сформулируется (на данной магии данных - легко).
Но надеяться написать синтаксический анализатор одним запросом с регулярками - самонадеянно.
Код: plsql
1.
'(.*?\))(\s*([+-])\s*|$)'

...
Рейтинг: 0 / 0
Разбор формулы на составляющие с помощью регулярных выражений
    #40050242
Корвин74
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic
Так это твои проблемы.


К сожалению да.
Последний вариант тоже не айс.
Трудно будет подобрать правильный паттерн для всех применяемых формул.

Все было хорошо, когда минусы и плюсы были вне составляющих формул.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Разбор формулы на составляющие с помощью регулярных выражений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]