No MariaDB, o
REGEXP_REPLACE()
A função substitui as ocorrências da substring dentro de uma string que corresponde ao padrão de expressão regular fornecido. A string inteira é retornada junto com as substituições.
Se não houver correspondência (ou seja, a string de entrada não contém a substring), a string inteira é retornada inalterada.
Sintaxe
A sintaxe fica assim:
REGEXP_REPLACE(subject, pattern, replace)
Onde
subject
é a string de entrada, pattern
é o padrão de expressão regular para a substring e replace
é a cadeia de substituição. Observe que, no momento da escrita, a versão do MariaDB de
REGEXP_REPLACE()
aceita menos argumentos que o REGEXP_REPLACE()
do MySQL função. A versão do MySQL permite fornecer argumentos para a posição inicial da pesquisa, qual ocorrência procurar, bem como uma forma de refinar a expressão regular com o tipo de correspondência. Exemplo
Aqui está um exemplo básico de uso de
REGEXP_REPLACE()
em MariaDB:SELECT REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird');
Resultado:
+------------------------------------------------+ | REGEXP_REPLACE('Cats and dogs', 'd.g', 'bird') | +------------------------------------------------+ | Cats and birds | +------------------------------------------------+
Nesse caso, há uma correspondência e a substring é substituída pela string de substituição.
Expressões regulares podem ser muito poderosas, e este exemplo usa um exemplo muito simples. Para usar
REGEXP_REPLACE()
efetivamente, você precisará saber o padrão correto a ser usado para o resultado desejado. Várias correspondências
Aqui está um exemplo com várias correspondências:
SELECT REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird');
Resultado:
+----------------------------------------------------------+ | REGEXP_REPLACE('My dog likes other dogs', 'd.g', 'bird') | +----------------------------------------------------------+ | My bird likes other birds | +----------------------------------------------------------+
Sem correspondência
Aqui está um exemplo em que não há correspondência:
SELECT REGEXP_REPLACE('Cats and dogs', 't.g', 'bird');
Resultado:
+------------------------------------------------+ | REGEXP_REPLACE('Cats and dogs', 't.g', 'bird') | +------------------------------------------------+ | Cats and dogs | +------------------------------------------------+
Não há correspondência, então a string original é retornada inalterada.
Sensibilidade de maiúsculas e minúsculas
O
REGEXP_REPLACE()
A função segue as regras de diferenciação de maiúsculas e minúsculas da ordenação efetiva. A correspondência é realizada sem distinção entre maiúsculas e minúsculas para ordenações que não diferenciam maiúsculas de minúsculas e com distinção entre maiúsculas e minúsculas para ordenações que diferenciam maiúsculas de minúsculas e para dados binários. Aqui está um exemplo:
SELECT
REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "My Default",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, 'c.t', 'dog') AS "Case Insensitive",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, 'c.t', 'dog') AS "Case Sensitive";
Resultado:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | My dogs | My dogs | My Cats | +------------+------------------+----------------+
Meu agrupamento padrão não diferencia maiúsculas de minúsculas. As outras duas strings foram forçadas a uma ordenação sem distinção entre maiúsculas e minúsculas e ordenação com distinção entre maiúsculas e minúsculas, respectivamente.
Fornecendo um
BINARY
string também diferencia maiúsculas de minúsculas (mais sobre isso posteriormente). Substituir distinção entre maiúsculas e minúsculas
A distinção entre maiúsculas e minúsculas do agrupamento pode ser substituída usando o (
?i
) e (?-i
) sinalizadores PCRE. Aqui está o exemplo anterior, mas desta vez usando o
(?-i)
sinalizar em cada padrão para forçar a diferenciação entre maiúsculas e minúsculas:SELECT
REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "My Default",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?-i)c.t', 'dog') AS "Case Insensitive",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?-i)c.t', 'dog') AS "Case Sensitive";
Resultado:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | My Cats | My Cats | My Cats | +------------+------------------+----------------+
E aqui está usando o
(?i)
sinalizador para forçar a diferenciação entre maiúsculas e minúsculas:SELECT
REGEXP_REPLACE('My Cats', '(?i)c.t', 'dog') AS "My Default",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_ci, '(?i)c.t', 'dog') AS "Case Insensitive",
REGEXP_REPLACE(_latin7'My Cats' COLLATE latin7_general_cs, '(?i)c.t', 'dog') AS "Case Sensitive";
Resultado:
+------------+------------------+----------------+ | My Default | Case Insensitive | Case Sensitive | +------------+------------------+----------------+ | My dogs | My dogs | My dogs | +------------+------------------+----------------+
Strings binárias
Passando um
BINARY
string também afeta a distinção entre maiúsculas e minúsculas. Com BINARY
strings, um caractere maiúsculo é diferente de sua contraparte minúscula:Exemplo:
SELECT
REGEXP_REPLACE('My Cats', 'c.t', 'dog') AS "Character",
REGEXP_REPLACE(BINARY 'My Cats', 'c.t', 'dog') AS "Binary";
Resultado:
+-----------+---------+ | Character | Binary | +-----------+---------+ | My dogs | My Cats | +-----------+---------+
Aqui está o que acontece se mudarmos o caso:
SELECT
REGEXP_REPLACE('My Cats', 'C.t', 'dog') AS "Character",
REGEXP_REPLACE(BINARY 'My Cats', 'C.t', 'dog') AS "Binary";
Resultado:
+-----------+---------+ | Character | Binary | +-----------+---------+ | My dogs | My dogs | +-----------+---------+
Diferenciação de maiúsculas e minúsculas em
BINARY
strings também podem ser substituídas pelo (?-i)
e (?i)
Sinalizadores de PCR:SELECT
REGEXP_REPLACE('My Cats', '(?-i)c.t', 'dog') AS "Character",
REGEXP_REPLACE(BINARY 'My Cats', '(?-i)c.t', 'dog') AS "Binary";
Resultado:
+-----------+---------+ | Character | Binary | +-----------+---------+ | My Cats | My Cats | +-----------+---------+
Argumentos nulos
Passando
null
pois qualquer argumento resulta em null
:SELECT
REGEXP_REPLACE(null, 'c.t', 'dog') AS "1",
REGEXP_REPLACE('Cat', null, 'dog') AS "2",
REGEXP_REPLACE('Cat', 'c.t', null) AS "3",
REGEXP_REPLACE(null, null, null) AS "4";
Resultado:
+------+------+------+------+ | 1 | 2 | 3 | 4 | +------+------+------+------+ | NULL | NULL | NULL | NULL | +------+------+------+------+
Número errado de argumentos
Passar o número errado de argumentos ou nenhum argumento resulta em um erro:
SELECT REGEXP_REPLACE();
Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_REPLACE'