2016-05-03 10 views
0

Ich habe die folgende Abfrage:Oracle REGEXP_SUBSTR arbeitet nicht mit meinem Muster

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; 

Wenn ich die folgende Eingabe geliefert:

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

Es gibt mir folgende:

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

Aber obwohl das Minuszeichen im Muster enthalten ist, wird es, wenn ich es innerhalb der geschweiften Klammern hinzugefügt habe, den Text nicht erkennen ymore als ein Spiel!

ex:

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

Ich bin nicht in der Lage, eine Lösung für diese zu finden, die es mich ist freaking, vor allem, als ich versuchte, allein auf das Minuszeichen entsprechen es funktioniert, wenn ich versuche, entsprechen Ziffern allein es funktioniert auch :(

+1

lass alles beiseite ... Warum benutzt du '|' in der Zeichenklasse? '[A-Za-z0-9] +' allein wird gut funktionieren – rock321987

+0

Ich weiß nicht, Würde es ein Problem verursachen? – simsim

+2

es passt '|' buchstäblich, wenn es dort in einer Schnur ist – rock321987

Antwort

1

Oracle erscheint POSIX-Stil reguläre Ausdrücke zu verwenden. https://docs.oracle.com/cd/B12037_01/server.101/b10759/ap_posix001.htm#i690819

der Backslash KEINEN metacharacter in einem POSIX-Klammerausdruck ist also in POSIX, den regulären Ausdruck [\d] entspricht einem \ oder eine d

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

Die Schrägstriche wahrscheinlich sind vermasselt, und sie sind nicht notwendig. Sie wissen auch nicht, dass | ein Literal innerhalb einer Char-Klasse ist (auf die die Kommentare ebenfalls hinweisen). Ich habe diese Probleme behoben, und ich habe die an den Anfang der Char-Klasse verschoben, wodurch es als ein Literal interpretiert werden kann.

Hier gehen Sie:

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

Das hat funktioniert! Danke. Ich habe versucht, alle zu entfernen, aber nicht funktioniert weder zuvor, die Minuszeichen-Position im Muster wurde gleich gehalten, deshalb hat es nicht funktioniert – simsim

1

konnte nicht ganz Abbildung das Problem mit Ihrem Code, aber hier ist eine Möglichkeit, es zu tun:

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; 

OUTPUT:

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

Vielen Dank, das ist für 11g, mein Server ist 10g – simsim