W Oracle REGEXP_REPLACE()
funkcja zastępuje wystąpienia podciągu w ciągu, który pasuje do podanego wzorca wyrażenia regularnego.
Rozszerza funkcjonalność REPLACE()
funkcji, pozwalając nam na użycie wzorców wyrażeń regularnych.
Składnia
Składnia wygląda tak:
REGEXP_REPLACE ( source_char, pattern
[, replace_string
[, position
[, occurrence
[, match_param ]
]
]
]
)
Gdzie:
source_char
to wyrażenie znakowe, które służy jako wartość wyszukiwania.pattern
jest wyrażeniem regularnym.replace_string
jest ciągiem zastępczym.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ć zastąpione. Wartość domyślna to0
, co oznacza zastąpienie wszystkich wystąpień.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, aby uzyskać więcej informacji.
Przykład
Oto podstawowy przykład użycia REGEXP_REPLACE()
w Oracle:
SELECT
REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird')
FROM DUAL;
Wynik:
Cats and birds
W tym przypadku występuje dopasowanie, a podciąg jest zastępowany ciągiem zastępczym.
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_REPLACE()
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_REPLACE('Cats and dogs', 't.g', 'bird');
Wynik:
+------------------------------------------------+ | REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') | +------------------------------------------------+ | Cats and dogs | +------------------------------------------------+
Brak dopasowania, więc oryginalny ciąg jest zwracany bez zmian.
Wiele meczów
Oto przykład z wieloma dopasowaniami:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird')
FROM DUAL;
Wynik:
My bird likes other birds
W razie potrzeby możesz jednak określić, które wystąpienie ma zostać zastąpione:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 1, 2)
FROM DUAL;
Wynik:
My dog likes other birds
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ć zastąpione. W takim przypadku drugie wystąpienie jest zastępowane.
Oto, co się stanie, jeśli rozpocznę wyszukiwanie po pierwszym wystąpieniu:
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 2)
FROM DUAL;
Wynik:
My dog likes other dogs
W tym przypadku ciąg nie jest aktualizowany, ponieważ po pozycji początkowej występuje tylko jedno wystąpienie.
Jeśli zmienię ostatni argument na 1
, a następnie jest aktualizowany zgodnie ze specyfikacją (ponieważ jest to pierwsze wystąpienie po określonej pozycji początkowej):
SELECT
REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird', 7, 1)
FROM DUAL;
Wynik:
My dog likes other birds
A jeśli się zastanawiasz, 0
określa wszystkie wystąpienia:
SELECT REGEXP_REPLACE(
'My dog likes big dogs and small dogs',
'd.g',
'bird', 1, 0
)
FROM DUAL;
Wynik:
My bird likes big birds and small birds
Ale nadal uwzględnia każdą określoną pozycję początkową:
SELECT REGEXP_REPLACE(
'My dog likes big dogs and small dogs',
'd.g',
'bird', 7, 0
)
FROM DUAL;
Wynik:
My dog likes big birds and small birds
Wrażliwość na wielkość liter
REGEXP_REPLACE()
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_REPLACE('My Cats', 'c.t', 'dog', 1, 0) AS "Default",
REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'i') AS "Case Insensitive",
REGEXP_REPLACE('My Cats', 'c.t', 'dog', 1, 0, 'c') AS "Case Sensitive"
FROM DUAL;
Wynik:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ My Cats My dogs My Cats
Z tych wyników wynika, że w moim domyślnym sortowaniu rozróżniana jest wielkość liter. Pozostałe dwa ciągi zostały zmuszone do dopasowania odpowiednio bez rozróżniania i rozróżniania wielkości liter.
Argumenty zerowe
Przekazywanie null
wyniki w null
dla większości argumentów, z wyjątkiem drugiego i szóstego:
SET NULL 'null';
SELECT
REGEXP_REPLACE(null, 'c.t', 'dog', 1, 0, 'i') AS "1",
REGEXP_REPLACE('Cat', null, 'dog', 1, 0, 'i') AS "2",
REGEXP_REPLACE('Cat', 'c.t', null, 1, 0, 'i') AS "3",
REGEXP_REPLACE('Cat', 'c.t', 'dog', null, 0, 'i') AS "4",
REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, null, 'i') AS "5",
REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, null) AS "6"
FROM DUAL;
Wynik:
1 2 3 4 5 6 _______ ______ _______ _______ _______ ______ null Cat null null null Cat
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_REPLACE()
FROM DUAL;
Wynik:
Error starting at line : 1 in command - SELECT REGEXP_REPLACE() 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 z przekazywaniem zbyt wielu argumentów:
SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', 'oops')
FROM DUAL;
Wynik:
Error starting at line : 1 in command - SELECT REGEXP_REPLACE('Cat', 'c.t', 'dog', 1, 0, 'i', '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_REPLACE()
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.
Więcej informacji i przykłady funkcji REGEXP_REPLACE()
można znaleźć w dokumentacji Oracle funkcja.