Oracle
 sql >> Baza danych >  >> RDS >> Oracle

REGEXP_REPLACE() Funkcja w Oracle

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 to 1 , 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 to 0 , 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 z REGEXP_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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wygenerować diagram relacji encji (ER) za pomocą Oracle SQL Developer

  2. Problemy z wywoływaniem procedury składowanej z C# z dużym CLOB

  3. Kolejność Oracle SQL według problemów z podzapytaniami!

  4. Oracle:jak dodać minuty do znacznika czasu?

  5. ORA-12728:nieprawidłowy zakres w wyrażeniu regularnym