W Oracle REGEXP_INSTR()
funkcja przeszukuje ciąg w poszukiwaniu wzorca wyrażenia regularnego. Zwraca liczbę całkowitą wskazującą początkową lub końcową pozycję dopasowanego podciągu (niezależnie od tego, który określisz).
Rozszerza funkcjonalność INSTR()
funkcji, pozwalając nam na użycie wzorców wyrażeń regularnych.
Składnia
Składnia wygląda tak:
REGEXP_INSTR ( source_char, pattern
[, position
[, occurrence
[, return_opt
[, match_param
[, subexpr ]
]
]
]
]
)
Gdzie:
source_char
to wyrażenie znakowe, które służy jako wartość wyszukiwania.pattern
jest wyrażeniem regularnym.position
jest dodatnią liczbą całkowitą, która określa, gdzie rozpocząć wyszukiwanie. Wartość domyślna to1
, czyli rozpocznij wyszukiwanie od pierwszego znaku.occurrence
jest dodatnią liczbą całkowitą, która określa, które wystąpienie ma zostać wyszukane. Wartość domyślna to1
, co oznacza wyszukiwanie pierwszego wystąpienia.return_opt
określa, czy Oracle ma zwrócić pozycję początkową, czy końcową dopasowanego podciągu. Użyj0
na początek i1
na zakończenie. Domyślna wartość to0
.match_param
pozwala zmienić domyślne zachowanie dopasowania funkcji. Na przykład pozwala określić wielkość liter, sposób obsługi wielu linii i spacji itp. Ten argument działa tak samo, jak w przypadku użycia zREGEXP_COUNT()
funkcjonować. Zobacz dokumentację Oracle dotyczącą tej funkcji, aby uzyskać więcej informacji.- Dla
pattern
z wyrażeniami podrzędnymi,subexpr
jest nieujemną liczbą całkowitą od 0 do 9 wskazującą, które podwyrażenie wepattern
ma być zwrócona przez funkcję. Ten argument działa tak samo, jak używany zREGEXP_INSTR()
funkcjonować. Więcej informacji na temat tej funkcji można znaleźć w dokumentacji Oracle.
Przykład
Oto podstawowy przykład użycia REGEXP_INSTR()
w Oracle:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g')
FROM DUAL;
Wynik:
4
W tym przypadku występuje dopasowanie i zwracana jest pozycja początkowa podciągu.
Wyrażenia regularne mogą mieć bardzo duże możliwości, a w tym przykładzie użyto bardzo prostego przykładu. Aby użyć REGEXP_INSTR()
skutecznie, będziesz musiał znać właściwy wzór, aby uzyskać pożądany efekt.
Brak dopasowania
Oto przykład, w którym nie ma dopasowania:
SELECT REGEXP_INSTR('My dogs like dregs', 't.g')
FROM DUAL;
Wynik:
0
Brak dopasowania, więc 0
jest zwracany.
Wiele meczów
Oto przykład z wieloma dopasowaniami:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g')
FROM DUAL;
Wynik:
4
Zwrócił pozycję pierwszego wystąpienia.
Możesz jednak określić, które wystąpienie ma zostać zastąpione:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Wynik:
14
Zauważ, że dodałem tutaj dwa argumenty; 1
i 2
. 1
określa miejsce pobytu w ciągu, aby rozpocząć wyszukiwanie (w tym przypadku od pierwszego znaku). 2
określa, które wystąpienie ma zostać wyszukane. W takim przypadku wyszukiwane jest drugie wystąpienie.
Oto, co się stanie, jeśli rozpocznę wyszukiwanie po pierwszym wystąpieniu:
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Wynik:
0
W tym przypadku nie ma dopasowania, ponieważ po pozycji wyjściowej występuje tylko jeden przypadek.
Jeśli zmienię ostatni argument na 1
, otrzymujemy dopasowanie (ponieważ jest to pierwsze wystąpienie po określonej pozycji startowej):
SELECT
REGEXP_INSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Wynik:
14
Zwróć pozycję końcową
Możesz przekazać piąty argument z 0
lub 1
aby określić, czy funkcja powinna zwracać pozycję początkową czy końcową podciągu.
Domyślna wartość to 0
(dla pozycji początkowej). Oto, co się stanie, jeśli określimy 1
:
SELECT
REGEXP_INSTR('My dogs are fluffy', 'd.g', 1, 1, 1)
FROM DUAL;
Wynik:
7
Żeby było jasne, oto znowu w porównaniu z 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;
Wynik:
Start End ________ ______ 4 7
Wrażliwość na wielkość liter
REGEXP_INSTR()
Funkcja jest zgodna z regułami określania i wyprowadzania Oracle, które definiują sortowanie, które ma być używane podczas dopasowywania ciągu do wzorca.
Można jednak jawnie określić rozróżnianie wielkości liter z opcjonalnym szóstym argumentem. Gdy to zrobisz, zastępuje to rozróżnianie wielkości liter lub akcentu w określonym zestawieniu.
Możesz określić i
dla dopasowania bez rozróżniania wielkości liter i c
do dopasowywania z uwzględnieniem wielkości liter.
Oto przykład:
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;
Wynik:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ 0 4 0
Na podstawie tych wyników moje zestawienie wydaje się uwzględniać wielkość liter. Pozostałe dwa ciągi zostały zmuszone do dopasowania odpowiednio bez rozróżniania i rozróżniania wielkości liter.
Wyrażenia podrzędne
Oto przykład użycia szóstego argumentu do zwrócenia określonego wzorca podwyrażenia:
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 1
)
FROM DUAL;
Wynik:
1
W tym przypadku zwróciłem pierwsze podwyrażenie.
Oto, co się stanie, jeśli określę trzecie podwyrażenie:
SELECT REGEXP_INSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 0, 'i', 3
)
FROM DUAL;
Wynik:
7
Argumenty zerowe
Z wyjątkiem szóstego argumentu, podając null
dla argumentu daje wynik 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;
Wynik:
1 2 3 4 5 6 7 _______ _______ _______ _______ _______ ____ _______ null null null null null 0 null
Domyślnie SQLcl i SQL*Plus zwracają spację, gdy null
występuje w wyniku polecenia SQL SELECT
oświadczenie.
Możesz jednak użyć SET NULL
aby określić inny ciąg do zwrócenia. Tutaj określiłem, że ciąg null
należy zwrócić.
Niewłaściwa liczba argumentów
Przekazanie funkcji bez argumentów lub za mało, skutkuje błędem:
SELECT REGEXP_INSTR()
FROM DUAL;
Wynik:
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:
To samo dotyczy sytuacji, gdy przekazujemy zbyt wiele argumentów:
SELECT REGEXP_INSTR('Cat', 'c.t', 1, 1, 1, 'i', 1, 'oops')
FROM DUAL;
Wynik:
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:
Więcej informacji
REGEXP_INSTR()
funkcja (jak również inna implementacja wyrażeń regularnych Oracle) jest zgodna ze standardem wyrażeń regularnych IEEE Portable Operating System Interface (POSIX) oraz z wytycznymi Unicode dotyczącymi wyrażeń regularnych Unicode Consortium.
Zobacz dokumentację Oracle, aby uzyskać więcej informacji i przykładów REGEXP_INSTR()
funkcja.