2016-05-03 11 views
0

私は、次のクエリを持っている:オラクルREGEXP_SUBSTRは私のパターンで作業していない

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# 

私は、次の入力を与えた場合

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; 

しかし、マイナス記号はパターンに含まれていますが、中括弧の中に追加しておけば、 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

>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; 

OUTPUT:

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

ありがとう、これは11g用です、 – simsim

関連する問題