No Oracle, o
REGEXP_SUBSTR() A função retorna uma substring de uma string, com base em um padrão de expressão regular. Ele estende a funcionalidade do
SUBSTR() função, permitindo-nos usar padrões de expressão regular. Sintaxe
A sintaxe fica assim:
REGEXP_SUBSTR ( source_char, pattern
[, position
[, occurrence
[, match_param
[, subexpr ]
]
]
]
) Onde:
source_charé uma expressão de caractere que serve como valor de pesquisa.patterné a expressão regular.positioné um número inteiro positivo que especifica onde iniciar a pesquisa. O padrão é1, ou seja, inicie a pesquisa no primeiro caractere.occurrenceé um inteiro não negativo que especifica qual ocorrência procurar. O padrão é1, o que significa que procura a primeira ocorrência.match_parampermite alterar o comportamento de correspondência padrão da função. Por exemplo, ele permite que você especifique a distinção entre maiúsculas e minúsculas, como várias linhas e espaços são tratados, etc. Este argumento funciona da mesma forma que quando usado com oREGEXP_COUNT()função. Consulte a documentação da Oracle para essa função para obter mais informações.- Para um
patterncom subexpressões,subexpré um inteiro não negativo de 0 a 9 indicando qual subexpressão nopatterndeve ser retornado pela função. Este argumento funciona da mesma forma que quando usado com oREGEXP_INSTR()função. Consulte a documentação da Oracle para obter mais informações sobre essa função.
Exemplo
Aqui está um exemplo básico de uso de
REGEXP_SUBSTR() no Oráculo:SELECT
REGEXP_SUBSTR('Cats and dogs', 'd.g')
FROM DUAL; Resultado:
dog
Nesse caso, há uma correspondência e a primeira (e neste caso, apenas) substring correspondente é retornada.
Expressões regulares podem ser muito poderosas, e este exemplo usa um exemplo muito simples. Para usar
REGEXP_SUBSTR() efetivamente, você precisará saber o padrão correto a ser usado para o resultado desejado. Sem correspondência
Aqui está um exemplo em que não há correspondência:
SET NULL 'null';
SELECT REGEXP_SUBSTR('My dogs like dregs', 't.g')
FROM DUAL; Resultado:
null
Não há correspondência, então
null é devolvido. Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que
null ocorre como resultado de um SQL SELECT demonstração. No entanto, você pode usar
SET NULL para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null deve ser devolvido. Várias correspondências
Aqui está um exemplo com várias correspondências:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g')
FROM DUAL; Resultado:
dog
No entanto, você pode especificar qual ocorrência substituir, se necessário:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 1, 2)
FROM DUAL; Resultado:
dag
Observe que adicionei dois argumentos aqui;
1 e 2 . O 1 especifica a localização na string para iniciar a pesquisa (neste caso, no primeiro caractere). O 2 é o que especifica qual ocorrência procurar. Neste caso, a segunda ocorrência é procurada. Aqui está o que acontece se eu iniciar a pesquisa após a primeira ocorrência:
SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 2)
FROM DUAL; Resultado:
null
Neste caso não há correspondência, pois há apenas mais uma ocorrência após a posição inicial.
Se eu alterar o último argumento para
1 , obtemos uma correspondência (porque é a primeira ocorrência após a posição inicial especificada):SELECT
REGEXP_SUBSTR('My dogs have dags', 'd.g', 8, 1)
FROM DUAL; Resultado:
dag
Sensibilidade de maiúsculas e minúsculas
O
REGEXP_SUBSTR() A função segue as regras de determinação e derivação de agrupamento do Oracle, que definem o agrupamento a ser usado ao combinar a string com o padrão. No entanto, você pode especificar explicitamente a distinção entre maiúsculas e minúsculas com o quinto argumento opcional. Ao fazer isso, ele substitui qualquer distinção entre maiúsculas e minúsculas ou acentos do agrupamento determinado.
Você pode especificar
i para correspondência que não diferencia maiúsculas de minúsculas e c para correspondência com distinção entre maiúsculas e minúsculas. Aqui está um exemplo:
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; Resultado:
Default Case Insensitive Case Sensitive __________ ___________________ _________________ null Cat null
Meu agrupamento parece diferenciar maiúsculas de minúsculas, com base nesses resultados. As outras duas strings foram forçadas a uma correspondência que não diferencia maiúsculas de minúsculas e diferencia maiúsculas de minúsculas, respectivamente.
Subexpressões
Aqui está um exemplo de uso do sexto argumento para retornar um padrão de subexpressão específico:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 1
)
FROM DUAL; Resultado:
cat
Nesse caso, retornei a primeira subexpressão.
Aqui está o que acontece se eu especificar a terceira subexpressão:
SELECT REGEXP_SUBSTR(
'catdogcow',
'(c.t)(d.g)(c.w)',
1, 1, 'i', 3
)
FROM DUAL; Resultado:
cow
Argumentos nulos
Se algum argumento for
null , o resultado é 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; Resultado:
1 2 3 4 5 6 _______ _______ _______ _______ _______ _______ null null null null null null
Número errado de argumentos
Não passar argumentos para a função, ou muito poucos, resulta em um erro:
SELECT REGEXP_SUBSTR()
FROM DUAL; Resultado:
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:
O mesmo se aplica quando passamos muitos argumentos:
SELECT REGEXP_SUBSTR('Cat', 'c.t', 1, 1, 'i', 1, 'oops')
FROM DUAL; Resultado:
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: Mais informações
O
REGEXP_SUBSTR() A função (assim como a outra implementação de expressões regulares da Oracle) está em conformidade com o padrão de expressão regular IEEE Portable Operating System Interface (POSIX) e com as Diretrizes de Expressão Regular Unicode do Unicode Consortium. Consulte a documentação do Oracle para obter mais informações e exemplos do
REGEXP_SUBSTR() função.