/ abc / required_string / 2 / sollte abc mit regexp_substr zurückgeben

0
dreambigcoder 18 Apr. 2018 im 21:32

5 Antworten

Beste Antwort
SELECT REGEXP_SUBSTR ('/abc/blah/blah/', '/([a-zA-Z0-9]+)/', 1, 1, NULL, 1) first_val 
from dual;
1
Andomar 18 Apr. 2018 im 19:14

Sie können nach /([^/]+)/ suchen, das besagt:

  • / Schrägstrich
  • ( Beginn des Unterausdrucks (in anderen Sprachen normalerweise als "Gruppe" bezeichnet)
    • [^/] ein anderes Zeichen als Schrägstrich
  • + stimmt ein- oder mehrmals mit dem vorhergehenden Ausdruck überein
  • ) Ende des Unterausdrucks
  • / Schrägstrich
  • Sie können das sechste Argument verwenden, um regexp_substr einen Unterausdruck auszuwählen . Hier übergeben wir 1, um nur die Zeichen zwischen den / s abzugleichen:

    select  regexp_substr(txt, '/([^/]+)/', 1, 1, null, 1)
    from    t1
    

    Sehen Sie, wie es bei SQL Fiddle funktioniert.

    1
    Andomar 18 Apr. 2018 im 19:19

    Classic SUBSTR + INSTR bietet eine einfache Lösung. Ich weiß, dass Sie reguläre Ausdrücke angegeben haben, aber - bedenken Sie auch, dass dies für ein großes Datenvolumen besser funktioniert.

    SQL> with test (col) as
      2    (select '/abc/required_string/2/' from dual)
      3  select substr(col, 2, instr(col, '/', 1, 2) - 2) result
      4  from test;
    
    RES
    ---
    abc
    
    SQL>
    
    1
    Littlefoot 18 Apr. 2018 im 19:48

    Hier ist eine andere Möglichkeit, das zweite Vorkommen einer Zeichenfolge gefolgt von einem Schrägstrich zu erhalten. Es behandelt das Problem, wenn dieses Element ebenfalls NULL ist. Erwarten Sie immer das Unerwartete!

    Hinweis: Wenn Sie die Regex-Form von [^/]+ verwenden und dieses Element NULL ist, wird "erforderliche Zeichenfolge" zurückgegeben, was NICHT Ihren Erwartungen entspricht! Dieses Formular behandelt KEINE NULL-Elemente. Weitere Informationen finden Sie hier: [https://stackoverflow.com/a/31464699/2543416]

    with tbl(str) as (
      select '/abc/required_string/2/' from dual union all
      select '//required_string1/3/' from dual
    )
    select  regexp_substr(str, '(.*?)(/)', 1, 2, null, 1)
    from    tbl;
    
    1
    Gary_W 18 Apr. 2018 im 20:14

    Sie können Folgendes versuchen:

    SELECT TRIM('/' FROM REGEXP_SUBSTR(mycolumn, '^\/([^\/]+)'))
      FROM mytable;
    

    Dieser reguläre Ausdruck entspricht dem ersten Auftreten eines Musters, das mit / beginnt (ich entkomme gewöhnlich / s in regulären Ausdrücken, daher \/, was nichts verletzt) ​​und schließt alle Nicht-Muster ein / Zeichen, die folgen. Wenn es keine solchen Zeichen gibt, wird NULL zurückgegeben.

    Hoffe das hilft.

    1
    David Faber 23 Apr. 2018 im 16:08