Categorias:

Funções de cadeia de caracteres (expressões regulares)

REGEXP_REPLACE

Retorna a entidade com o padrão especificado (ou todas as ocorrências do padrão) removido ou substituído por uma cadeia de caracteres de substituição.

Sintaxe

 REGEXP_REPLACE( <subject> ,
                 <pattern>
                   [ , <replacement>
                     [ , <position>
                       [ , <occurrence>
                         [ , <parameters> ]
                       ]
                     ]
                   ]
)
Copy

Argumentos

Obrigatório:

subject

A cadeia de caracteres a ser procurada por correspondências.

pattern

Padrão a atender.

Para diretrizes sobre como especificar padrões, consulte Funções de cadeia de caracteres (expressões regulares).

Opcional:

replacement

Cadeia de caracteres que substitui as subcadeias de caracteres combinadas pelo padrão. Se uma cadeia de caracteres vazia for especificada, a função remove todos os padrões correspondentes e retorna a cadeia de caracteres resultante.

Padrão: '' (cadeia de caracteres vazia).

position

Número de caracteres a partir do início da cadeia de caracteres onde a função inicia a busca por correspondências. O valor deve ser um número inteiro positivo.

Padrão: 1 (a busca por uma correspondência começa no primeiro caractere à esquerda)

occurrence

Especifica a ocorrência do padrão a ser substituído. Se 0 for especificado, todas as ocorrências são substituídas.

Padrão: 0 (todas as ocorrências)

parameters

Cadeia de caracteres de um ou mais caracteres que especifica os parâmetros usados para a busca de correspondências. Valores com suporte:

Parâmetro

Descrição

c

Correspondência com distinção entre maiúsculas e minúsculas

i

Correspondência sem distinção entre maiúsculas e minúsculas

m

Modo multilinha

e

Extração de subcorrespondências

s

O caractere curinga POSIX do modo de linha única . corresponde a \n

Padrão: c

Para obter mais informações, consulte Especificação dos parâmetros para a expressão regular.

Retornos

Retorna um valor do tipo VARCHAR.

Se não for encontrada nenhuma correspondência, retorna a entidade original.

Retorna NULL se algum argumento for NULL.

Notas de uso

  • A cadeia de caracteres de substituição pode conter referências retroativas para grupos de captura; por exemplo, subexpressões do padrão. Um grupo de captura é uma expressão regular que se encontra entre parênteses (( )). O número máximo de grupos de captura é nove.

    As referências anteriores correspondem a expressões dentro de um grupo de captura. As referências inversas tem a forma n onde n é um valor de 0 a 9, inclusive, que se refere à instância correspondente do grupo de captura. Para mais informações, consulte Exemplos (neste tópico).

  • Os parênteses (( )) e colchetes ([ ]) atualmente devem ser em forma de parênteses duplos para serem analisados como cadeias de caracteres literais.

    O exemplo abaixo mostra como remover parênteses:

    SELECT REGEXP_REPLACE('Customers - (NY)','\\(|\\)','') AS customers;
    
    Copy
    +----------------+
    | CUSTOMERS      |
    |----------------|
    | Customers - NY |
    +----------------+
    
  • Para notas adicionais de uso, consulte Notas de uso geral para funções de expressão regular.

Detalhes do agrupamento

Arguments with collation specifications currently aren’t supported.

Exemplos

O exemplo a seguir substitui todos os espaços na cadeia de caracteres por nada (ou seja, todos os espaços são removidos):

SELECT REGEXP_REPLACE('It was the best of times, it was the worst of times',
                      '( ){1,}',
                      '') AS result;
Copy
+------------------------------------------+
| RESULT                                   |
|------------------------------------------|
| Itwasthebestoftimes,itwastheworstoftimes |
+------------------------------------------+

O exemplo a seguir corresponde à cadeia de caracteres times e a substitui pela cadeia de caracteres days. A correspondência começa no primeiro caractere da cadeia de caracteres e substitui a segunda ocorrência da substring:

SELECT REGEXP_REPLACE('It was the best of times, it was the worst of times',
                      'times',
                      'days',
                      1,
                      2) AS result;
Copy
+----------------------------------------------------+
| RESULT                                             |
|----------------------------------------------------|
| It was the best of times, it was the worst of days |
+----------------------------------------------------+

O exemplo a seguir usa referências anteriores para reorganizar a cadeia de caracteres firstname middlename lastname como lastname, firstname middlename e inserir uma vírgula entre lastname e firstname:

SELECT REGEXP_REPLACE('firstname middlename lastname',
                      '(.*) (.*) (.*)',
                      '\\3, \\1 \\2') AS name_sort;
Copy
+--------------------------------+
| NAME_SORT                      |
|--------------------------------|
| lastname, firstname middlename |
+--------------------------------+

Os exemplos restantes usam os dados na seguinte tabela:

CREATE OR REPLACE TABLE regexp_replace_demo(body VARCHAR(255));

INSERT INTO regexp_replace_demo values
  ('Hellooo World'),
  ('How are you doing today?'),
  ('the quick brown fox jumps over the lazy dog'),
  ('PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS');
Copy

O exemplo a seguir insere o caractere * entre todos os caracteres do sujeito, incluindo o início e o fim, usando um grupo vazio (()), que encontra uma correspondência entre quaisquer dois caracteres:

SELECT body,
       REGEXP_REPLACE(body, '()', '*') AS replaced
  FROM regexp_replace_demo;
Copy
+---------------------------------------------+-----------------------------------------------------------------------------------------+
| BODY                                        | REPLACED                                                                                |
|---------------------------------------------+-----------------------------------------------------------------------------------------|
| Hellooo World                               | *H*e*l*l*o*o*o* *W*o*r*l*d*                                                             |
| How are you doing today?                    | *H*o*w* *a*r*e* *y*o*u* *d*o*i*n*g* *t*o*d*a*y*?*                                       |
| the quick brown fox jumps over the lazy dog | *t*h*e* *q*u*i*c*k* *b*r*o*w*n* *f*o*x* *j*u*m*p*s* *o*v*e*r* *t*h*e* *l*a*z*y* *d*o*g* |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | *P*A*C*K* *M*Y* *B*O*X* *W*I*T*H* *F*I*V*E* *D*O*Z*E*N* *L*I*Q*U*O*R* *J*U*G*S*         |
+---------------------------------------------+-----------------------------------------------------------------------------------------+

O exemplo a seguir remove todas as vogais, substituindo-as por nada, independentemente da ordem ou caso:

SELECT body,
       REGEXP_REPLACE(body, '[aeiou]', '', 1, 0, 'i') AS replaced
  FROM regexp_replace_demo;
Copy
+---------------------------------------------+----------------------------------+
| BODY                                        | REPLACED                         |
|---------------------------------------------+----------------------------------|
| Hellooo World                               | Hll Wrld                         |
| How are you doing today?                    | Hw r y dng tdy?                  |
| the quick brown fox jumps over the lazy dog | th qck brwn fx jmps vr th lzy dg |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PCK MY BX WTH FV DZN LQR JGS     |
+---------------------------------------------+----------------------------------+

O exemplo a seguir remove todas as palavras que contêm a letra minúscula o da entidade, correspondendo a um limite de palavra (\b), seguido por zero ou mais caracteres de palavra (\S), a letra o e, em seguida, zero ou mais caracteres de palavra até o próximo limite de palavra:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b') AS replaced
  FROM regexp_replace_demo;
Copy
+---------------------------------------------+-----------------------------------------+
| BODY                                        | REPLACED                                |
|---------------------------------------------+-----------------------------------------|
| Hellooo World                               |                                         |
| How are you doing today?                    |  are   ?                                |
| the quick brown fox jumps over the lazy dog | the quick   jumps  the lazy             |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS |
+---------------------------------------------+-----------------------------------------+

O exemplo a seguir substitui todas as palavras que contêm a letra minúscula o, trocando as letras antes e depois da primeira ocorrência de o e substituindo o pela sequência de caracteres @@:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1') AS replaced
  FROM regexp_replace_demo;
Copy
+---------------------------------------------+-------------------------------------------------+
| BODY                                        | REPLACED                                        |
|---------------------------------------------+-------------------------------------------------|
| Hellooo World                               | @@Helloo rld@@W                                 |
| How are you doing today?                    | w@@H are u@@y ing@@d day@@t?                    |
| the quick brown fox jumps over the lazy dog | the quick wn@@br x@@f jumps ver@@ the lazy g@@d |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS         |
+---------------------------------------------+-------------------------------------------------+

O exemplo a seguir é igual ao anterior, mas a substituição começa na posição 3 da entidade:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1', 3) AS replaced
  FROM regexp_replace_demo;
Copy
+---------------------------------------------+-------------------------------------------------+
| BODY                                        | REPLACED                                        |
|---------------------------------------------+-------------------------------------------------|
| Hellooo World                               | He@@lloo rld@@W                                 |
| How are you doing today?                    | How are u@@y ing@@d day@@t?                     |
| the quick brown fox jumps over the lazy dog | the quick wn@@br x@@f jumps ver@@ the lazy g@@d |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS         |
+---------------------------------------------+-------------------------------------------------+

O exemplo a seguir é igual ao anterior, mas apenas a terceira ocorrência é substituída, começando na posição 3 da entidade:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1', 3, 3) AS replaced
  FROM regexp_replace_demo;
Copy
+---------------------------------------------+----------------------------------------------+
| BODY                                        | REPLACED                                     |
|---------------------------------------------+----------------------------------------------|
| Hellooo World                               | Hellooo World                                |
| How are you doing today?                    | How are you doing day@@t?                    |
| the quick brown fox jumps over the lazy dog | the quick brown fox jumps ver@@ the lazy dog |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS      |
+---------------------------------------------+----------------------------------------------+

O exemplo a seguir é igual ao anterior, mas utiliza correspondência sem diferenciação de maiúsculas e minúsculas:

SELECT body,
       REGEXP_REPLACE(body, '\\b(\\S*)o(\\S*)\\b', '\\2@@\\1', 3, 3, 'i') AS replaced
  FROM regexp_replace_demo;
Copy
+---------------------------------------------+----------------------------------------------+
| BODY                                        | REPLACED                                     |
|---------------------------------------------+----------------------------------------------|
| Hellooo World                               | Hellooo World                                |
| How are you doing today?                    | How are you doing day@@t?                    |
| the quick brown fox jumps over the lazy dog | the quick brown fox jumps ver@@ the lazy dog |
| PACK MY BOX WITH FIVE DOZEN LIQUOR JUGS     | PACK MY BOX WITH FIVE DOZEN R@@LIQU JUGS     |
+---------------------------------------------+----------------------------------------------+