Expressões Regulares em DB2 SQL – Regule isso!

Impressione seus colegas JAVA com as expressões regulares em DB2 SQL – Se torne um especialista em regex com essas amostras (utilização de regex no Editor TSO & regex como predicado)
As referências a blogs que focam nesse assunto ajudarão a complementar seu conhecimento sobre “Expressões Regulares em Db2 SQL” (equivalência em padrões avançados, teste regex e utilização REGEXP_LIKE)

Nunca fui um grande fã de expressões regulares (regex) porque já trabalho com Mainframe e regex sempre foi “só para aquelas caixas pequenas que você consegue levantar”, no entanto, desde o DB2 12 tenho começado a usá-las nos lugares mais inesperados.

TSO? Você está brincando?
Sim, você pode usar o regex até no editor de TSO. Ele encontrará todas as ocorrências de dados que começam com M, contém DB e terminam com pelo menos dois números. Depois do filtro (e OU em regex) faz a mesma coisa mas para linhas que começam com O, seguidas de 2DB e que terminam com dois números:

Note que mudar de R para RC faz com que o regex seja sensível aos caracteres.
Use “x all” primeiro, para então ver o que será encontrado…

E a mensagem fica parecendo:

Muito bacana! Naturalmente você pode utilizar quase qualquer formatos de regex, onde quer que você queira, e isso é muito poderoso. Têm suporte em Find, Change (mas não para o segundo argumento em Change) e Exclude.

 

Maiores informações sobre o regex

Utilização em TSO: Para maiores informações sobre o uso de TSO confira o post KC

https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.f54em00/useofr1.htm#useofr1

Utilização de REXX: a utilização do Rexx também está disponível e o Martin Packer escreveu um ótimo artigo sobre uma rotina de testes Regex que você pode experimentar também:

https://www.ibm.com/developerworks/community/blogs/MartinPacker/entry/tso_regular_expression_testing_tool?lang=en_us

 

E o Db2?

Bem… aonde é possível o regex já existia há muito tempo. Tudo isso dentro do próprio DB2. O artigo do Fred Sobotka “Padrões avançados de correspondência com Expressões Regulares em DB2 11.1 para LUW” no blog IDUG discute muitas maneiras interessantes de utiliza-los e seus irmãos e valem a pena serem lidos.

E o DB2 “de verdade”?

Bom… nós temos… quer dizer… não é exatamente o que você imagina, mas está lá. Você precisa superar alguns obstáculos e manipular dados requeridos no XML.

Como é? A lista Regex pode ser útil da seguinte forma:

Tudo bem, chega de esperar… aqui está o regex que lista as tabelas que entre 2 e 5 caracteres, de B a Z e termina em 2 numéricos:

Não vai ganhar nenhum concurso de beleza, mas… funciona!

Como funciona?

Só um bog mediano SELECT, FROM e WHERE – Nada de novo aqui!

Isso deve ser visto como duas declarações separadas, primeiro a declaração interna:

Isso “traduz” a coluna NAME num constructo XML com o nome xmltbname pronto para o regex que nós “fazemos de conta” através de um XMLEXISTS:

Esse utiliza a função  fn:matches que fará o regex de fato.

Os dados no regex ^[B-Z]{2,5}[0-9]{2}$ é um regex normal e usa o xmltbname como entrada.

O fn:matches é booleano e, portanto, retorna como Verdadeiro ou Falso. Este é, então, um predicado “normal”, pois qualquer linha que seja “verdadeira” deve ter passado pelo regex.

Claro como lama!

É um pouco estranho e posso recomendar mais leituras:

Primeiro o excelente site Regex onde você pode saber mais sobre as alegrias e perigos destas “criaturas”:

http://www.rexegg.com/

E a IBM XQuery docu que descreve detalhadamente como o fn:matches funciona:

https://www.ibm.com/support/knowledgecenter/SSEPEK_12.0.0/xml/src/tpc/db2z_regularexpression.html

Os dois valem a pena de serem lidos – tome cuidado especialmente com os “quantificadores explosivos”!

CPU?

Sim, você adivinhou. Não existe almoço grátis!

A utilização desse método não é fácil.

Só deve ser utilizado somente se normal LIKE, REPLACE e TRANSLATE podem não conseguirem fazer o trabalho facilmente e se você precisa desenvolver códigos regex como: ^(?=(?!(.)1)([^DO:105-93+30])(?-1)(?<!d(?<=(?![5-90-3])d))).[^WHY?]$

Bom, não se surpreenda se seus colegas começarem a te detestar.

    

Fique a vontade para mandar perguntas e comentários

TTFN,
Roy Boxwell
Senior Architect

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors