2016-05-05 20 views
0

Ich habe eine Zeichenfolge 'TICKER: IBM IBM Corporation Inc.' und ich möchte den Ticker und seinen Wert entfernen und nur die restlichen in Oracle PL/SQL greifen.Oracle PL/SQL Regexp_replace für mehrere Wörter

Also habe ich diese Abfrage aber es funktioniert nicht so, wie ich gedacht:

SELECT REGEXP_REPLACE(
      'TICKER: IBM IBM Corporation Inc.', 
      '(.*):[[:space:]](.*)[[:space:]](.*)', '\3') 
     FROM dual; 

Ich hatte gehofft, dass ‚\ 3‘ ergeben würde mir ‚IBM Corporation Inc.‘ aber ich bekomme nur 'Inc.' als Ergebnis.

REGEXP_REPLACE('TICKER:IBMIBMCORPORATIONINC.','(.*):[[:SPACE:]](.*)[[:SPACE:]](.*)','\3') 
----------------------------------------------------------------------------- 
Inc.                      

1 rows selected 

Update:

SELECT REGEXP_REPLACE(
     'TICKER: IBM IBM Corporation Inc.', 
     '(.*):[[:space:]](.*)[[:space:]](.*)', '\1|\2|\3') 
    FROM dual; 

Ergebnis:

REGEXP_REPLACE('TICKER:IBMIBMCORPORATIONINC.','(.*):[[:SPACE:]](.*)[[:SPACE:]](.*)','\1|\2|\3') 
-------------------------------------------------------------------------------- 
TICKER|IBM IBM Corporation|Inc. 

Was soll ich in den regulären Ausdruck fehlt?

Danke.

+0

Frage: Haben Sie schon versucht ""? Siehe auch: https://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_posix001.htm#BABJDBHB – paulsm4

Antwort

2

Ihr zweiter Capture-Ausdruck war alles, einschließlich des nächsten Speicherplatzes.

Ich sollte erwähnen, dass ich in Oracle, nicht PL/SQL getestet. Ich würde denken, dass es keinen Unterschied geben würde.

PS: die folgenden Stellvertreter arbeiten auch:

-- using only one capturing expression 
SELECT REGEXP_REPLACE(
     'TICKER: IBM IBM Corporation Inc.', 
     '.*: [^ ]* (.*)', '\1') 
    FROM dual; 

    -- using no capturing expressions 
    SELECT REGEXP_REPLACE(
     'TICKER: IBM IBM Corporation Inc.', 
     '.*: [^ ]* ', '') 
    FROM dual; 
+0

Vielen Dank. Es wirkt wie ein Zauber. – JKK

+0

Ich dachte im gleichen Sinne, die ersten beiden Wörter durch NULL zu ersetzen, vorausgesetzt, sie sind immer da und der Wert (Symbol?) Ist immer 1 Wort): '\ w +: \ w + '' –

+1

Sollte es wahrscheinlich anziehen ein wenig durch Verankern an den Anfang der Zeichenfolge: ''^ \ w +: \ w +''. –

1
SELECT REGEXP_REPLACE(
      'TICKER: IBM IBM Corporation Inc.', 
      '^(.*?):\s(\S*)\s(.*)$', 
      '\3' 
     ) 
FROM DUAL; 

oder unterstützt Ihr Code nicht viele Änderungen müssen es (Verankerung es zu Beginn der Zeichenfolge und Umwandeln der ersten beiden funktioniert Wildcard-Treffer sind nicht-gierig):

SELECT REGEXP_REPLACE(
      'TICKER: IBM IBM: Corporation Inc.', 
      '^(.*?):[[:space:]](.*?)[[:space:]](.*)', 
      '\3' 
     ) 
FROM DUAL; 
+0

Unwahrscheinlich, aber man weiß es nie. Versuchen Sie es mit einem Firmennamen, der einen Doppelpunkt enthält: TICKER: IBM: IBM Corporation: Inc.. Goes to show eine Abfrage sollte ausgeführt werden, um zuerst nach Doppelpunkten in den Daten zu suchen. –

+0

Guter Punkt auf Beschreibung, die einen Doppelpunkt enthält. Ihre Abfrage scheint es perfekt zu handhaben. Vielen Dank. +1 – JKK

+1

@JKK Erwarte immer das Unerwartete! Abhängig von der Quelle der Daten und wie gut sie (oder höchstwahrscheinlich nicht) validiert ist, können alle Arten von Crud akzeptiert und in der Datenbank landen. Überprüfen Sie die Daten immer zuerst, bevor Sie Annahmen wie "die Firmennamen enthalten niemals einen Doppelpunkt" machen :-) –

Verwandte Themen