W Oracle REGEXP_SUBSTR()
funkcja zwraca podciąg z ciągu na podstawie wzorca wyrażenia regularnego.
Rozszerza funkcjonalność SUBSTR()
funkcji, pozwalając nam na użycie wzorców wyrażeń regularnych.
Składnia
Składnia wygląda tak:
REGEXP_SUBSTR ( source_char, pattern
[, position
[, occurrence
[, 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 nieujemną liczbą całkowitą, która określa, które wystąpienie ma zostać wyszukane. Wartość domyślna to1
, co oznacza wyszukiwanie pierwszego wystąpienia.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_SUBSTR()
w Oracle:
SELECT
REGEXP_SUBSTR('Cats and dogs', 'd.g')
FROM DUAL;
Wynik:
dog
W tym przypadku występuje dopasowanie i zwracany jest pierwszy (i w tym przypadku jedyny) pasujący podciąg.
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_SUBSTR()
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:
SET NULL 'null';
SELECT REGEXP_SUBSTR('My dogs like dregs', 't.g')
FROM DUAL;
Wynik:
null
Brak dopasowania, więc null
jest zwracany.
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ć.
Wiele meczów
Oto przykład z wieloma dopasowaniami:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g')
FROM DUAL;
Wynik:
dog
W razie potrzeby możesz jednak określić, które wystąpienie ma zostać zastąpione:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL;
Wynik:
dag
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_SUBSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL;
Wynik:
null
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_SUBSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL;
Wynik:
dag
Wrażliwość na wielkość liter
REGEXP_SUBSTR()
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 za pomocą opcjonalnego piątego argumentu. 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_SUBSTR('My Cats', 'c.t', 1, 1) AS "Default",
REGEXP_SUBSTR('My Cats', 'c.t', 1, 1, 'i') AS "Case Insensitive",
REGEXP_SUBSTR('My Cats', 'c.t', 1, 1, 'c') AS "Case Sensitive"
FROM DUAL;
Wynik:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ null Cat null
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_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 1
)
FROM DUAL;
Wynik:
cat
W tym przypadku zwróciłem pierwsze podwyrażenie.
Oto, co się stanie, jeśli określę trzecie podwyrażenie:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 3
)
FROM DUAL;
Wynik:
cow
Argumenty zerowe
Jeśli jakikolwiek argument ma wartość null
, wynik to null
:
SET NULL 'null';
SELECT
REGEXP_SUBSTR(null, 'c.t', 1, 1, 'i', 1) AS "1",
REGEXP_SUBSTR('Cat', null, 1, 1, 'i', 1) AS "2",
REGEXP_SUBSTR('Cat', 'c.t', null, 1, 'i', 1) AS "3",
REGEXP_SUBSTR('Cat', 'c.t', 1, null, 'i', 1) AS "4",
REGEXP_SUBSTR('Cat', 'c.t', 1, 1, null, 1) AS "5",
REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', null) AS "6"
FROM DUAL;
Wynik:
1 2 3 4 5 6 _______ _______ _______ _______ _______ _______ null null null null null null
Niewłaściwa liczba argumentów
Przekazanie funkcji bez argumentów lub za mało, skutkuje błędem:
SELECT REGEXP_SUBSTR()
FROM DUAL;
Wynik:
Error starting at line : 1 in command - SELECT REGEXP_SUBSTR() 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_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'oops')
FROM DUAL;
Wynik:
Error starting at line : 1 in command - SELECT REGEXP_SUBSTR('Cat', 'c.t', 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_SUBSTR()
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_SUBSTR()
funkcja.