Oracle
 sql >> Datenbank >  >> RDS >> Oracle

REGEXP_INSTR()-Funktion in Oracle

In Oracle der REGEXP_INSTR() Funktion durchsucht eine Zeichenfolge nach einem regulären Ausdrucksmuster. Es gibt eine Ganzzahl zurück, die die Anfangs- oder Endposition der übereinstimmenden Teilzeichenfolge angibt (je nachdem, welche Sie angeben).

Es erweitert die Funktionalität von INSTR() funktionieren, indem sie uns erlauben, reguläre Ausdrucksmuster zu verwenden.

Syntax

Die Syntax lautet wie folgt:

REGEXP_INSTR ( source_char, pattern
               [, position
                  [, occurrence
                     [, return_opt
                        [, match_param
                           [, subexpr ]
                        ]
                     ]
                  ]
               ]
             )

Wo:

  • source_char ist ein Zeichenausdruck, der als Suchwert dient.
  • pattern ist der reguläre Ausdruck.
  • position ist eine positive Ganzzahl, die angibt, wo die Suche beginnen soll. Der Standardwert ist 1 , was bedeutet, beginnen Sie die Suche beim ersten Zeichen.
  • occurrence ist eine positive ganze Zahl, die angibt, nach welchem ​​Vorkommen gesucht werden soll. Der Standardwert ist 1 , was bedeutet, dass nach dem ersten Vorkommen gesucht wird.
  • return_opt gibt an, ob Oracle die Anfangs- oder Endposition der übereinstimmenden Teilzeichenfolge zurückgeben soll. Verwenden Sie 0 für den Anfang und 1 für das Ende. Der Standardwert ist 0 .
  • match_param können Sie das standardmäßige Übereinstimmungsverhalten der Funktion ändern. Beispielsweise können Sie die Groß-/Kleinschreibung angeben, wie mit mehreren Zeilen und Leerzeichen umgegangen wird usw. Dieses Argument funktioniert genauso wie bei Verwendung mit REGEXP_COUNT() Funktion. Weitere Informationen finden Sie in der Oracle-Dokumentation für diese Funktion.
  • Für ein pattern mit Teilausdrücken, subexpr ist eine nicht negative Ganzzahl von 0 bis 9, die angibt, welcher Unterausdruck in pattern ist soll von der Funktion zurückgegeben werden. Dieses Argument funktioniert genauso wie bei Verwendung mit REGEXP_INSTR() Funktion. Weitere Informationen zu dieser Funktion finden Sie in der Dokumentation von Oracle.

Beispiel

Hier ist ein einfaches Beispiel für die Verwendung von REGEXP_INSTR() bei Oracle:

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;

Ergebnis:

4

In diesem Fall gibt es eine Übereinstimmung und die Anfangsposition des Teilstrings wird zurückgegeben.

Reguläre Ausdrücke können sehr leistungsfähig sein, und dieses Beispiel verwendet ein sehr einfaches Beispiel. Um REGEXP_INSTR() zu verwenden Um effektiv zu sein, müssen Sie das richtige Muster kennen, um das gewünschte Ergebnis zu erzielen.

Keine Übereinstimmung

Hier ist ein Beispiel, bei dem es keine Übereinstimmung gibt:

SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;

Ergebnis:

0

Es gibt keine Übereinstimmung, also 0 zurückgegeben wird.

Mehrere Übereinstimmungen

Hier ist ein Beispiel mit mehreren Übereinstimmungen:

SELECT 
    REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;

Ergebnis:

4

Es gab die Position des ersten Vorkommens zurück.

Sie können jedoch angeben, welches Vorkommen ersetzt werden soll:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;

Ergebnis:

14

Beachten Sie, dass ich hier zwei Argumente hinzugefügt habe; 1 und 2 . Die 1 gibt den Aufenthaltsort in der Zeichenfolge an, um die Suche zu starten (in diesem Fall beim ersten Zeichen). Die 2 gibt an, nach welchem ​​Vorkommen gesucht werden soll. In diesem Fall wird nach dem zweiten Vorkommen gesucht.

Folgendes passiert, wenn ich die Suche nach dem ersten Vorkommen starte:

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;

Ergebnis:

0

In diesem Fall gibt es keine Übereinstimmung, da es nach der Startposition nur noch ein weiteres Vorkommen gibt.

Wenn ich das letzte Argument in 1 ändere , dann erhalten wir eine Übereinstimmung (weil es das erste Vorkommen nach der angegebenen Startposition ist):

SELECT 
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;

Ergebnis:

14

Geben Sie die Endposition zurück

Sie können als fünftes Argument entweder 0 übergeben oder 1 um anzugeben, ob die Funktion die Anfangs- oder Endposition der Teilzeichenfolge zurückgeben soll.

Der Standardwert ist 0 (für die Anfangsposition). Folgendes passiert, wenn wir 1 angeben :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;

Ergebnis:

7

Nur um es klarzustellen, hier ist es noch einmal im Vergleich zu 0 :

SELECT 
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 0) AS "Start",
    REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1) AS "End"
FROM DUAL;

Ergebnis:

   Start    End 
________ ______ 
       4      7

Groß-/Kleinschreibung

Der REGEXP_INSTR() Die Funktion folgt den Sortierungsbestimmungs- und Ableitungsregeln von Oracle, die die zu verwendende Sortierung definieren, wenn die Zeichenfolge mit dem Muster abgeglichen wird.

Mit dem optionalen sechsten Argument können Sie jedoch explizit die Groß-/Kleinschreibung angeben. Wenn Sie dies tun, überschreibt es alle Groß- und Kleinschreibung oder Akzente der bestimmten Kollatierung.

Sie können i angeben für Übereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung und c für Groß- und Kleinschreibung.

Hier ist ein Beispiel:

SELECT 
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0) AS "Default",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'i') AS "Case Insensitive",
    REGEXP_INSTR('My Cats', 'c.t', 1, 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;

Ergebnis:

   Default    Case Insensitive    Case Sensitive 
__________ ___________________ _________________ 
         0                   4                 0

Basierend auf diesen Ergebnissen scheint bei meiner Sortierung zwischen Groß- und Kleinschreibung unterschieden zu werden. Die anderen beiden Strings wurden zu einem case-insensitiven bzw. case-sensitiven Matching gezwungen.

Teilausdrücke

Hier ist ein Beispiel für die Verwendung des sechsten Arguments, um ein bestimmtes Unterausdrucksmuster zurückzugeben:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 1
    )
FROM DUAL;

Ergebnis:

1

In diesem Fall habe ich den ersten Teilausdruck zurückgegeben.

Folgendes passiert, wenn ich den dritten Unterausdruck spezifiziere:

SELECT REGEXP_INSTR(
    'catdogcow', 
    '(c.t)(d.g)(c.w)', 
    1, 1, 0, 'i', 3
    )
FROM DUAL;

Ergebnis:

7

Null-Argumente

Mit Ausnahme des 6. Arguments, das null bereitstellt für ein Argument ergibt null :

SET NULL 'null';
SELECT 
    REGEXP_INSTR(null, 'c.t', 1, 1, 0, 'i', 1) AS "1",
    REGEXP_INSTR('Cat', null, 1, 1, 0, 'i', 1) AS "2",
    REGEXP_INSTR('Cat', 'c.t', null, 1, 0, 'i', 1) AS "3",
    REGEXP_INSTR('Cat', 'c.t', 1, null, 0, 'i', 1) AS "4",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, null, 'i', 1) AS "5",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, null, 1) AS "6",
    REGEXP_INSTR('Cat', 'c.t', 1, 1, 0, 'i', null) AS "7"
FROM DUAL;

Ergebnis:

      1       2       3       4       5    6       7 
_______ _______ _______ _______ _______ ____ _______ 
   null    null    null    null    null    0    null 

Standardmäßig geben SQLcl und SQL*Plus ein Leerzeichen zurück, wenn null tritt als Ergebnis eines SQL SELECT auf Erklärung.

Sie können jedoch SET NULL verwenden um eine andere Zeichenfolge anzugeben, die zurückgegeben werden soll. Hier habe ich angegeben, dass der String null zurückgegeben werden soll.

Falsche Anzahl von Argumenten

Wenn der Funktion keine oder zu wenige Argumente übergeben werden, führt dies zu einem Fehler:

SELECT REGEXP_INSTR()
FROM DUAL;

Ergebnis:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR()
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"
*Cause:    
*Action:

Dasselbe gilt, wenn wir zu viele Argumente übergeben:

SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;

Ergebnis:

Error starting at line : 1 in command -
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL
Error at Command Line : 1 Column : 8
Error report -
SQL Error: ORA-00939: too many arguments for function
00939. 00000 -  "too many arguments for function"
*Cause:    
*Action:

Weitere Informationen

Der REGEXP_INSTR() -Funktion (sowie die andere Implementierung regulärer Ausdrücke von Oracle) entspricht dem IEEE Portable Operating System Interface (POSIX)-Standard für reguläre Ausdrücke und den Unicode-Richtlinien für reguläre Ausdrücke des Unicode-Konsortiums.

Weitere Informationen und Beispiele für REGEXP_INSTR() finden Sie in der Oracle-Dokumentation Funktion.