2016-05-03 4 views
0

У меня есть следующий запрос:Oracle REGEXP_SUBSTR не работает с моим рисунком

SELECT DISTINCT A.REZ FROM 
(
    SELECT REGEXP_SUBSTR(P_EQUATION, '([A-Z|a-z|0-9]+)\{([0-9|\+|\-| |\*|\/\)\(]+)\}#([A-Z|a-z|0-9|_]+)#',1, LEVEL) AS REZ FROM DUAL 
    CONNECT BY REGEXP_SUBSTR(P_EQUATION, '([A-Z|a-z|0-9]+)\{([0-9|\+|\-| |\*|\/\)\(]+)\}#([A-Z|a-z|0-9|_]+)#',1, LEVEL) IS NOT NULL 
) A; 

Если я снабжал следующий вход:

P_EQUATION := 'A123{(01+02)*2}#ACCOUNT_BALANCE# + B123{(20+10)/20}#ACCOUNT_BALANCE#'; 

Это дает мне следующее:

REZ 
------------------------------------- 
A123{(01+02)*2}#ACCOUNT_BALANCE# 
B123{(20+10)/20}#ACCOUNT_BALANCE# 

Но, хотя знак «минус» включен в шаблон, если я добавил его внутри фигурных скобок, он не распознает текст и ymore как матч!

например:

P_EQUATION := 'A123{(01-02)*2}#ACCOUNT_BALANCE#'; 

Я не смог найти решение этой проблемы, он бесконтрольного меня, особенно, когда я пытался соответствовать один только минус это работает, если я пытался соответствовать цифры сами по себе также работает :(

+1

оставьте в стороне все, что вы используете '|' в классе символов? '[A-Za-z0-9] +' один будет работать нормально – rock321987

+0

Не знаю, не вызовет ли проблемы? – simsim

+2

будет соответствовать '' 'буквально, если он есть в строке – rock321987

ответ

1

Oracle, как представляется, с помощью регулярных выражений POSIX стиль:. https://docs.oracle.com/cd/B12037_01/server.101/b10759/ap_posix001.htm#i690819

обратной косой НЕ метасимволом в выражении скобки POSIX Таким образом, в стандарте POSIX, регулярное выражение [\d] соответствует \ или d

>http://www.regular-expressions.info/posixbrackets.html

Обратные косые черты, вероятно, баловаться его, и они не обязательно. Вы также не понимаете, что | является литералом внутри класса char (в комментариях также указывалось). Я исправил эти проблемы, и я переместил - в начало класса char, что позволяет интерпретировать его как литерал.

Здесь вы идете:

([A-Za-z0-9]+)\{([-0-9+ */)(]+)\}#([A-Za-z0-9_]+)# 
+0

Это сработало! Спасибо. Я попытался удалить все |, но не работал ни до того, ни минусовая позиция в шаблоне была сохранена одинаково, поэтому она не работала – simsim

1

не мог выяснить этот вопрос с вашим кодом, но вот один из способов сделать это:

with temp as 
(
    select 'A123{(01+02)*2}#ACCOUNT_BALANCE# + B123{(20+10)/20}#ACCOUNT_BALANCE#' P_EQUATION from dual union all 
    select 'A123{(01-02)*2}#ACCOUNT_BALANCE#' P_EQUATION from dual 
) 

SELECT DISTINCT A.REZ FROM 
(
    SELECT REGEXP_SUBSTR(P_EQUATION, '[[:alpha:]]+[[:digit:]]+{\([[:digit:]]+\S[[:digit:]]+\)\S[[:digit:]]+}#[[:alpha:]]+_[[:alpha:]]+#',1, LEVEL) AS REZ FROM temp 
    CONNECT BY REGEXP_SUBSTR(P_EQUATION, '[[:alpha:]]+[[:digit:]]+{\([[:digit:]]+\S[[:digit:]]+\)\S[[:digit:]]+}#[[:alpha:]]+_[[:alpha:]]+#',1, LEVEL) IS NOT NULL 
) A; 

ВЫВОД:

REZ                                                                    
--------------------------------------- 
B123{(20+10)/20}#ACCOUNT_BALANCE#                                                             
A123{(01-02)*2}#ACCOUNT_BALANCE#                                                             
A123{(01+02)*2}#ACCOUNT_BALANCE# 
+1

Спасибо, это за 11g, мой сервер 10g – simsim

Смежные вопросы