2016-07-05 17 views
1

Ich möchte eine Semikolon getrennte Zeichenfolge in seine Teile mit PL/SQL teilen. Es funktioniert gut mit REGEXP_SUBSTR, solange es keine runde Klammer in der Zeichenfolge gibt.REGEXP_SUBSTR runde Klammer

Beispiel:

select REGEXP_SUBSTR('A;B;C','[^(";")]+',1,1), 
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,2), 
REGEXP_SUBSTR('A;B;C','[^(";")]+',1,3) 
from dual; 

Ergebnis wie erwartet: ABC

Das Ergebnis für A; B (1); C sollte AB (1) C sein, aber was ich bekommen ist: AB 1

select REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,1), 
REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,2), 
REGEXP_SUBSTR('A;B(1);C','[^(";")]+',1,3) 
from dual; 

Das bedeutet ‚(‘ als Trennzeichen erkannt wird, aber ich verstehe dieses Verhalten nicht. Kann mir bitte jemand aufklären?

Antwort

5

[] ist eine Multilingual Regular Expression Syntax, die "Bracket-Ausdruck für die Angabe einer übereinstimmenden Liste, die mit einem der in der Liste dargestellten Ausdrücke übereinstimmen sollte. Eine Nonmatching Liste Ausdruck beginnt mit einem Zirkumflex (^) und gibt eine Liste, die alle Zeichen entspricht mit Ausnahme der Ausdrücke in der Liste vertreten.“

Zum Beispiel

select REGEXP_SUBSTR('"A";"B(1)";"C"','[^";"]+',1,1) 
from dual; 

wird A B(1) C zurück, wo [^";"]+ hält " OR ; als Trennzeichen in Ihrem Beispiel

Ähnlich [^(";")]+ hält " OR ; OR ( OR ) als s Eparatoren gegen Ihre Erwartung.

Also für Ihre erwartete Ausgabe, können Sie versuchen

select REGEXP_SUBSTR('A;B(1);C','[^;]+',1,1), 
REGEXP_SUBSTR('A;B(1);C','[^;]+',1,2), 
REGEXP_SUBSTR('A;B(1);C','[^;]+',1,3) 
from dual; 
+0

Vielen Dank, ich habe es. – user1838910

+0

10 @ user1838910 Sie können dies als eine Lösung akzeptieren und diese Frage schließen, wenn Sie glücklich sind – SriniV

1

Wieder einmal zu Ich steige auf meine soapbox Leute über die Gefahren zu warnen vor den regulären Ausdruck des Formats '[^;]+' mit begrenzten Zeichenfolgen zu analysieren. Bereue und werde gerettet! Es behandelt keine NULL-Elemente und wird unerwartete Ergebnisse liefern. Weitere Informationen und Beweise finden Sie unter here. Bitte verwenden Sie dieses Format statt und ruhig schlafen zu wissen, Ihre Ausgabe genau ist:

Hinweis das zweite Element (NULL)

SQL> with tbl(str) as (
     select 'A;;B(1);C' from dual 
    ) 
    select regexp_substr(str, '(.*?)(;|$)', 1, level, NULL, 1) 
    from tbl 
    connect by level <= regexp_count(str, ';') + 1; 

REGEXP_SU 
--------- 
A 

B(1) 
C 

SQL> 

Notiere die NULL zurück für Element 2, wie erwartet. Wenn Sie die regex Format '[^;]+' und versuchen, das zweite Element zu erhalten, erhalten Sie 'B(1)' was falsch ist, da es das dritte Element ist:

NICHT VERWENDET:

SQL> with tbl(str) as (
    2 select 'A;;B(1);C' from dual 
    3 ) 
    4 select regexp_substr(str, '[^;]+', 1, level) 
    5 from tbl 
    6 connect by level <= regexp_count(str, ';') + 1; 

REGEXP_SU 
--------- 
A 
B(1) 
C 


SQL> 

Schauen Sie nah, der NULL ist der letzte. Stellen Sie sich alle falschen Berichte vor. Lass keinen von ihnen dir gehören!

+0

Ich bin mir dessen bewusst. Ersetzen von '|' von '| 'vor der Verwendung von regexp_substr macht die Arbeit in meinem Fall. Trotzdem danke für den Hinweis. – user1838910

+0

Nicht sicher, worüber du sprichst, aber Realspirituals verdient die Stimme, da seine Antwort die richtige für deine Frage ist. Meins ist eine zusätzliche Information, die Sie beachten sollten.Was auch immer Sie tun, stellen Sie sicher, dass Sie mit allen möglichen Kombinationen von unerwarteten Daten, die Sie sich vorstellen können, testen, und stellen Sie sicher, dass Ihre Lösung sie alle behandelt! –