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
Postar um comentário