REGEX - Fundamentos

ABAIXO REGEX MUITO UTEIS PARA FACILITAR A REFATORAÇÃO, ETC...
ORDENADO DE MAIOR USO E MENOR COMPLEXIDADE PARA MENOR USO E MAIOR COMPLEXIDADE:

DELPHI//OBJECT-PASCAL//SQL-SERVER  

PASSA PARA UPPERCASE:               
LOCALIZAR:.*
SUBSTITUIR:\U$0

PASSA PARA LOWCASE:                   
LOCALIZAR:.*
SUBSTITUIR:\L$0

REMOVE ESPAÇOS EXTRAS:
LOCALIZAR:(\w)  +(\w)
SUBSTITUIR:$1 $2

MOVE VIRGULA PARA ANTES DA QUEBRA DE LINHA:
LOCALIZAR: *(\r\n *) ,
SUBSTITUIR:,$1 

SCRIPT SQL (DELPHI TO SQL):
L:('')|(^ *')|(',?$)
S:?1':?2:?3

CONVERT UPDATE TO SELECT:
L:(update)| .*? set|(?: |^)(.*?) ?= ?(.*?)(, ?|$)(?s)(?=.*from)
S:?1SELECT:?2 $2, $3$4

ACERTAR DATA NA REGION:
L:^  (?: {10})(.*?)(\d{2}(?:-|/)\d{2}(?:-|/)\d{4}) - 
S:  $2$1

DELPHI-SQL SEPARAR CAMPOS EM LINHAS SEPARADAS:
LOCALIZAR:( \w*,)(?!'\);)
SUBSTITUIR:$1'\);\r\n      SQL.ADD\(' 

INVERTER OPERADOR E OPERANDO:
LOCALIZAR:([^ ]*) *:= *([^ ]*?)(;|\r\n)
SUBSTITUIR:$2 := $1$3

INVERTER TUPLA DE LINHAS:
LOCALIZAR:(.*)\r\n(.*)
SUBSTITUIR:$2\r\n$1
[PODE SER ADEQUADO FÁCILMENTE PARA N LINHAS]

INVERTER OPERANDOS EM UM IF-ELSE:
LOCALIZAR:( *if +.*\r\n  +then +.*? *:= *)(.*)(\r\n  +.*? *:= *)(.*);
SUBSTITUIR:$1$4$3$2;

SUBSTITUIR IF SIMPLES PARA IF COMPOSTO:
L:( *if.*)(\r\n *)  then (.*)
S:$1 then begin $2  $3$2End;

Nomear campo descrito por variáveis:
LOCALIZAR:(@(\w*))
SUBSTITUIR:$1 $2

ADEQUA DBGRID EVENTOS:
LOCALIZAR:(Qry\w*)|(Direction\w*)|OrderBy\w*
SUBSTITUIR:?1QryHistorico:(?2DirectionHistorico:OrderByHistorico)

UNIFICA LINHAS DA DECLARAÇÃO DE VARIÁVEIS:
LOCALIZAR:(\w*) *: *(\w*); *\r\n *(\w*) *: *\2; *(?:\r\n)?
SUBSTITUIR:$1, $3 : $2;\r\n

REMOVER EXPLICIT:
LOCALIZAR: *Explicit(left|top|width|height) = -?\d+\r\n
SUBSTITUIR:

REMOVER COMENTÁRIOS DE UM HTML:
LOCALIZAR:(?=<!--).*?(?<=-->)
SUBSTITUIR:

FECHAMENTO DE VERSÃO:
LOCALIZAR:(Versao *:= *'Versão) \d\d\.\d\d\d\d-\d\d\d\d('; //Ano \. mês dia - hora minuto)
SUBSTITUIR:$1 21.0921-1545$2

UTILIZAR A FUNÇÃO STRTOCHAR AO INVÉS DO COPY POR EXTENSO:
LOCALIZAR:copy\( *(\w*?) *, *1 *, *1 *\)
SUBSTITUIR:StrToChar\($1\)

ACERTAR IDENTAMENTO "AND NA LATERAL" SQL-SQL:
LOCALIZAR:AND *(\r\n +)   
SUBSTITUIR:$1AND 

ACERTAR IDENTAMENTO "AND NA LATERAL" DELPHI-SQL:
LOCALIZAR:AND *(',\r\n( |')+)   
SUBSTITUIR:$1AND 

LOCALIZAR CAMPO DO SQL E COLOCAR CONVERT VARCHAR 10:
LOCALIZAR:(\+ *)((?:\w|\.)*)( *\+?)
SUBSTITUIR:$1convert\(varchar\(10\), $2\)$3


PASSAR AND PARA LINHA DE BAIXO:
LOCALIZAR:((?: |')+)(AND.*?)(AND.*?)(',)?
SUBSTITUIR:$1$2$4\r\n$1$3$4

EXTRAINDO SELECT DO CURSOR:
LOCALIZAR:.*?declare.*?Cursor.*?\r\n(?s)(.*?)(?-s)\r\n.*?open Aux(?s).*?(?-s)deallocate.*?\r\n
SUBSTITUIR:$1

LOCALIZAR:
ENCONTRAR O FINAL DE UM PARENTESIS:
\(((?>[^()]+|(?R))*)\)

UNIFICA DECLARAÇÃO DE VARIÁVEIS:
[1 VARIÁVEL - 1 VARIÁVEL]

LOCALIZAR:(\w*) *: *(\w*);\r\n *(\w*) *: *\2;
SUBSTITUIR:$1, $3: $2;

SUBSTITUIR RX POR JEDI:
LOCALIZAR¹: (.PAS e DFM)
TRx(\w*)
SUBSTITUIR¹:
TJv$1
LOCALIZAR²(.PAS e DFM)
Rx(\w*)
[OU (?!Rx\w*(?:,|;))Rx(\w*)]
[OU (?![^(]Rx\w*(?:,|;))[^(]\KRx(\w*)]
SUBSTITUIR²:
Jv$1
LOCALIZAR³: (SOMENTE .PAS)
Form(\w*)\.JvQry(\w*)\.
SUBSTITUIR³:
Form$1.RxQry$2.

ADICIONAR [...] NO LUGAR DE FIMLINHASTR:
LOCALIZAR¹:(?=.*FIMLINHASTR)(INFOBOX|RETORNASQL|EXECUTASQL|YESNOBOX|RETORNASQLVARIOSCAMPOS)((\(((?>[^()]+|(?2))*)\)))
SUBSTITUIR¹:$1\([$4$5]\)
LOCALIZAR²:(\+FimLinhaStr\+ *\r\n.*?) *?,? *?(FormMain\.DataBase) *?,? *?(Self\.Name)? *?
SUBSTITUIR²:$1
LOCALIZAR3:(\+FimLinhaStr\+ *\r\n.*?)( *)
SUBSTITUIR3:$1$2 
LOCALIZAR4:(?=.*FIMLINHASTR)(:= *)(?s)('.*?)(;|\r\n *ELSE)(?-s)
SUBSTITUIR4:$1CONCATE\([$2]\)$3
LOCALIZAR:\+FimLinhaStr\+
SUBSTITUIR:,
LOCALIZAR:FimLinhaStr\+
SUBSTITUIR:'',
LOCALIZAR:\+FimLinhaStr
[CONFERIR POR CONTA]

ADEQUAR DRAWCOLUMNCELL:
LOCALIZAR:(?s)(procedure T\w*\.\w*)(DBGrid\w*)(DrawColumnCell.*?^begin).*?(^end;)
SUBSTITUIR:$1$2$3\r\n  Grid_DrawColumnCell\( $2, DataCol, State, Rect\);\r\n$4
[NÃO ESTÁ ADEQUADO PARA CONSIDERAR ALTERAÇÃO DE COR, VERIFIQUE!!!]

CORRIGI IDENTAÇÃO:
LOCALIZAR:( *)if *(.*?) *then *\r\n *(.*?) *(?:(;)|(\r\n *else))
SUBSTITUIR:$1if $2\r\n$1  then $3?4;:$5
LOCALIZAR:^  ( *)(.*\r\n) *else(?: *|[\r\n]*)(?:(if)|(.*?;))
SUBSTITUIR:  $1$2$1  else?3(\r\n$1$3):($1$4)

INVERTER ORDEM DE OBJETOS DA TELA (E DISTANCIAMENTO/TAMANHO):
LOCALIZAR:(?s)(^.*?object.*?)(Left = \d*)(.*?)(Top = \d*)(.*?)(Width = \d*)(.*?)(Height = \d*)(.*?end$)\r\n(^.*?object.*?)(Left = \d*)(.*?)(Top = \d*)(.*?)(Width = \d*)(.*?)(Height = \d*)(.*?end$)
SUBSTITUIR:${10}$2${12}$4${14}$6${16}$8${18}\r\n$1${11}$3${13}$5${15}$7${17}$9

CONVERTE FUNÇÃO ESCRITA EM VÁRIAS LINHAS EM LINHA ÚNICA:
LOCALIZAR:((?:,|;))\r\n *
SUBSTITUIR:$1 

OPERAÇÃO INVERSA:
LOCALIZAR:(,|;)( *\w* *)
SUBSTITUIR:$1\r\n                                     $2

PEGANDO UM OBJETO INTEIRO (BEM IDENTADO) COM GROUP BACKREFERENCE:
LOCALIZAR:(?s)( +)(object.*?)(\1end)
SUBSTITUIR:$1$2$3
[ A IDÉIA DESSE É ESSE REGEX SER ADEQUADO PARA A SITUAÇÃO DESEJADA]

PASSAR O HISTÓRICO DE ALTERAÇÕES DO PADRÃO ANTIGO PARA O NOVO:
LOCALIZAR:(?(?=.*Histórico de alterações:)(.*\r\n)|(?(?=})(.*)|(.*)))
SUBSTITUIR:?1$1  data       | chk permissão | chk usuários lojas | Tarefa\r\n:(?2$2:             |               |         --         |      $3)

ASSOCIAR EDIT COM LABEL:
Localizar:(?<s> *)(?:(CmbBFCBenef)|(EdtReducaoST)|(EdtPorcentagemMargem)|(EdtAliquotaPIS)|(EdtAliquotaCofins)|(EdtAliquotaST))\.Enabled(?<f>[^;]*;)
Substituir:$0\r\n$+{s}(?2(Label29):(?3(Label30):(?4(Label34):(?5(Label7):(?6Label11:Label29)))))\.Enabled$+{f}

Adicionar o atributo "NomeTela" ao instanciar um objeto, seguindo o que está no nome da unit:
Localizar:
(?s)unit (\w*);.*\K\.New(?!\()
Substituir:
.New\('$1'\)

SUBSTITUIR POR CHAMADA DE FUNÇÃO:
Localizar:(?s)(?<!procedure JavaScriptCall\( Script: String \);..begin..  )(?:UserSession[\.\r\n ]+)?WebApplication[\.\r\n ]+CallBackResponse[\.\r\n ]+AddJavaScriptToExecute(\(((?>[^()]+|(?1))*)\))
Substituir:JavaScriptCall$1

UTILIZAR SELF.NAME ao INVES DO NOME DA UNIT NO NEW DO TRetornaSQLCamposPeloNome:
LOCALIZAR:
(?s)Form(\w*): TForm\1;.*?T(?:Retorna|Executa)SQLCamposPeloNome\.New\(\K'[^']*'
SUBSTITUIR:
Self.Name

Acerta nome da UNIT no "TRetornaSQLCamposPeloNome.New":
LOCALIZAR:
(?s)\A.*?unit ([^;]*);.*?TRetornaSQLCamposPeloNome\.New\('\K[^']*(?='\))
SUBSTITUIR:
$1

Conversão do tipo de quebra de linha (manual para a no array de string), quando já no array:
\r\n( *)\KInfobox((?!\(((?>((?!\+FimLinhaStr\+)[^()](?:(?!\+FimLinhaStr\+)[^()](?-1)|))|(?-2))*)\)))\(\[(?<p>[^()]*?)\+FimLinhaStr\+(?: *\r\n *)?
InfoBox\(\[$+{p},\r\n$1         
\r\n( *)\KInfobox((?!\(((?>((?!FimLinhaStr\+)[^()](?:(?!FimLinhaStr\+)[^()](?-1)|))|(?-2))*)\)))\(\[(?<p>[^()]*?)FimLinhaStr\+(?: *\r\n *)?
InfoBox\(\[$+{p}'',\r\n$1         

Recursão elegante (alternativa ao "+"):
(?:([^)(])((?-2)(?-1)|))

Recursão elegante (alternativa ao "*"):
(?:([^)(](?-1)|))

Agrupamento:
L:(?x) (?!^\ +   (?<VAR>(?<=\ )\w+(?=\ |:))  \ *:=\ *  (?:(?<DEF_VAR>\k{VAR}\ *\+\ *)|)  (?<CONTEUDO>  (.*?)  | ('[^'\r\n]*'.*?)  )   (?:(?<FIMLINHASTR>\ *\+\ *FimLinhaStr)|);)^.*\r\n\K^\ +   (?<VAR>(?<=\ )\w+(?=\ |:))  \ *:=\ *  (?:(?<DEF_VAR>\k{VAR}\ *\+\ *)|)  (?<CONTEUDO>  (.*?)  | ('[^'\r\n]*'.*?)  )   (?:(?<FIMLINHASTR>\ *\+\ *FimLinhaStr)|);(?=(?:\r|\n)+\ +((?<=\ )\k{VAR}(?=\ |:))\ *:=\ *((?<=\ )\k{VAR}(?=\ |:)))
S:$0 // ### HEADER
L':(?x) (?=^\ +   (?<VAR>(?<=\ )\w+(?=\ |:))  \ *:=\ *  (?:(?<DEF_VAR>\k{VAR}\ *\+\ *)|)  (?<CONTEUDO>  (.*?)  | ('[^'\r\n]*'.*?)  )   (?:(?<FIMLINHASTR>\ *\+\ *FimLinhaStr)|);\ //\ \#\#\#\ HEADER)^.*\r\n(^\ +   (?<VAR>(?<=\ )\w+(?=\ |:))  \ *:=\ *  (?:(?<DEF_VAR>\k{VAR}\ *\+\ *)|)  (?<CONTEUDO>  (.*?)  | ('[^'\r\n]*'.*?)  )   (?:(?<FIMLINHASTR>\ *\+\ *FimLinhaStr)|);\ *(?:\r|\n)+)*\K^\ +   (?<VAR>(?<=\ )\w+(?=\ |:))  \ *:=\ *  (?:(?<DEF_VAR>\k{VAR}\ *\+\ *)|)  (?<CONTEUDO>  (.*?)  | ('[^'\r\n]*'.*?)  )   (?:(?<FIMLINHASTR>\ *\+\ *FimLinhaStr)|);
S':$0 // ### FOOTER
L'':(?x) ^\ +   (?<VAR>(?<=\ )\w+(?=\ |:))  \ *:=\ *  \k{VAR}\ *\+\ * (.*?) (?:(?<FIMLINHASTR>\ *\+\ *FimLinhaStr)|);(?=\ *\r\n^\ +   (?<VAR>(?<=\ )\k{VAR}(?=\ |:))  \ *:=\ *  (?:(?<DEF_VAR>\k{VAR}\ *\+\ *)|)  (?<CONTEUDO>  (.*?)  | ('[^'\r\n]*'.*?)  )   (?:(?<FIMLINHASTR>\ *\+\ *FimLinhaStr)|);)
S'':$0 // ### MIDDER
L''':^(?<SPACE> *)(?<VAR>(?<= )\w+(?= |:)) *:= *(?:(?<DEF_VAR>\k{VAR}) \+|)(?<CONTEUDO>.*?)(?:(?<QL>\+FimLinhaStr)|); // ### HEADER
S''':$+{SPACE}$+{VAR} := (?{DEF_VAR}$+{VAR} + :)Concate\([$+{CONTEUDO}(?{QL}, : + )
L'''':^(?<SPACE> *)(?<VAR>(?<= )\w+(?= |:)) *:= *(?:(?<DEF_VAR>\k{VAR}) \+|)(?<CONTEUDO>.*?)(?:(?<QL>\+FimLinhaStr)|); // ### MIDDER
S'''':$+{SPACE}$+{CONTEUDO}(?{QL}, : + )
L''''':^(?<SPACE> *)(?<VAR>(?<= )\w+(?= |:)) *:= *(?:(?<DEF_VAR>\k{VAR}) \+|)(?<CONTEUDO>.*?)(?:(?<QL>\+FimLinhaStr)|); // ### FOOTER
S''''':$+{SPACE}$+{CONTEUDO}(?{QL}, \r\n$+{SPACE}'':)]\);

DESCARTE:
(?:UserSession\.)?(?:WebApplication\.CallBackResponse\.AddJavaScriptToExecute\()?TSwa\.MSG\(.*?,(.*?), *'error'\)\)?
(?:UserSession\.)?(?:WebApplication\.CallBackResponse\.AddJavaScriptToExecute\()?TSwa\.MSG\(.*?,(.*?), *'info'\)\)?
(?:UserSession\.)?(?:WebApplication\.CallBackResponse\.AddJavaScriptToExecute\()?TSwa\.MSG\(.*?,(.*?), *'success'\)\)?
(?:UserSession\.)?(?:WebApplication\.CallBackResponse\.AddJavaScriptToExecute\()?TSwa\.MSG\(.*?,(.*?), *'.*?'\)\)?


REFACTORING LIST:
LOCALIZAR:(\w) +(\w)
SUBSTITUIR:$1 $2
*CONFERIR*
LOCALIZAR: *(\r\n *) ,
SUBSTITUIR:,$1
*CONFERIR*
LOCALIZAR:((?:,|;))\r\n *
SUBSTITUIR:$1 
LOCALIZAR:(,|;)( *\w* *)
SUBSTITUIR:$1\r\n  
 

OUTROS:
REGEX'S SOLTOS (DE USO UNICO OU RARO, APENAS PARA REFERÊNCIA)


LEGENDA:
".": QUALQUER CARACTERE.
"+": PADRÃO DE CARACTERE ANTERIOR PODE SE REPETIR.
"*": PADRÃO DE CARACTERE ANTERIOR PODE SE REPETIR, OU PODE NEM EXISTIR.
".*?": QUALQUER CARACETERE ATÉ ENCONTRAR A PRIMEIRA COMBINAÇÃO DO QUE ESTÁ A DIREITA.
".*": QUALQUER CARACETERE ATÉ ENCONTRAR A ÚLTIMA COMBINAÇÃO DO QUE ESTÁ A DIREITA (EVITE USAR ESTE, PREFIRA ".*?").
"(" e ")": DEFINE A ORDEM E A PRIORIDADE DA COMBINAÇÃO DOS PADRÕES OU GRUPOS DE CAPTURA PARA SUBSTITUIÇÃO($1, $2...).
"\": TRANSFORMA UM DOS CARACTERES ACIMA EM CARACTERE LITERAL.
"\r\n": QUEBRA DE LINHA.
"\w": QUALQUER LETRA.
"\d": QUALQUER DIGITO.
"$": Serve para referenciar uma cadeia de caracteres referente a um grupo de captura com o número desse grupo a direita do cifrão (os números se dão da esquerda pra direita e se houver o marcador "?:" no inicio do grupo ele é desconsiderado da contagem).
"\K": Serve para não incluir o padrão atrás do \K na combinação, serve apenas de verificação para combinar o que está a direita.
"\U": Converte o que está a direita para uppercase.
"\L": Converte o que está a direita para lowcase.
"\1", "\2" ... "\9": PEGA O VALOR DE UM GRUPO ANTERIOR PARA SERVIR DE REFERENCIA EM COMBINAR.

* QUALQUER OUTRO SIMBOLO É TRATADO COMO CARACTERE LITERAL.

MARCADORES DE GRUPO DE CAPTURA.
(?:)   DESCONSIDERA O GRUPO NA CONTAGEM PARA SUBSTITUIÇÃO.
(?=)  AFIRMA QUE PARA QUE HAJA A COMBINAÇÃO NAQUELA LINHA(caso não for usado a quebra de linha na consulta) TEM QUE HAVER A CADEIA DE CARACTERE DESCRITA DENTRO DESSE GRUPO APÓS A POSIÇÃO RELATIVA(POSIÇÃO EM QUE O MOTOR DO REGEX ESTÁ, E NÃO A POSIÇÃO DO CURSOR QUE O USUÁRIO DEIXOU AO FAZER A PESQUISA) ATUAL DO CURSOR DE CARACTERES, pode ser usado também para fazer um operador ternário (?(?=)|).
(?s)   IGNORA QUEBRA DE LINHA.

EXTRA:
OPERADOR TERNÁRIO DE SUBSTITUIÇÃO
?N(...):(...)

Para ajudar a entender o regex acesse o site:
https://jex.im/regulex/#!flags=&re=%5E(a%7Cb)*%3F%24
Nele há representações visuais do regex.


* ESSE É APENAS UM RESUMO PESSOAL, PARA DOCUMENTAÇÃO COMPLETA ACESSE:"https://npp-user-manual.org/docs/searching/".

PARA MAIS CONTEÚDOS SOBRE REGEX ACESSE: FAQ Desk: Where to find REGular EXpressions (RegEx) documentation ? | Notepad++ Community (notepad-plus-plus.org)

Comentários

Postagens mais visitadas deste blog

REGEX APLICADO

REGEX RECURSIVO: Equalização horizontal ==>(?=.*\QÂncora([\E)^ (?(?S)|([^\r\n\]]*\r\n)+) )(?! )