REGEX RECURSIVO: Equalização horizontal ==>(?=.*\QÂncora([\E)^ (?(?S)|([^\r\n\]]*\r\n)+) )(?! )
(?=.*\QÂncora([\E)^ (?<S>(?<!\QÂncora([\E).(?:(?P>S)|([^\r\n\]]*\r\n)+) )(?! )
Eis um Regex recursivo para encontrar uma combinação perfeita de parentesis:
(?<r>\((?>[^()]+|(?P>r))*\))
Exemplo de uso:
ExecutaSQL(?<r>\((?>[^()]+|(?P>r))*\))
Para localizar:
ExecutaSQL('Select top 1 1'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ');
ExecutaSQL('Select top 1 1'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ', FormMain.DataBase);
ExecutaSQL('Select top 1 1'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+(AdoQueryCliCod.AsString)+''' ',
FormMain.DataBase, ExePath + 'Teste.SQL');
ExecutaSQL(['Select top 1 1'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ']);
ExecutaSQL(['Select top 1 1',
'From Clientes',
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ']);
ExecutaSQL('Select CliCod, CliNome'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+(AdoQueryCliCod.AsString)+''' ');
ExecutaSQL('Select CliCod, CliNome'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ', FormMain.DataBase);
ExecutaSQL('Select CliCod, CliNome'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ',
FormMain.DataBase, ExePath + 'Teste.SQL');
ExecutaSQL(['Select CliCod, CliNome'+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ']);
ExecutaSQL(['Select CliCod, CliNome',
'From Clientes',
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ']);
ExecutaSQL('Select ''Existe'' Sim '+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ');
ExecutaSQL('Select ''Existe'' Sim '+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ', FormMain.DataBase);
ExecutaSQL('Select ''Existe'' Sim '+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ',
FormMain.DataBase, ExePath + 'Teste.SQL');
ExecutaSQL(['Select ''Existe'' Sim '+FimLinhaStr+
'From Clientes'+FimLinhaStr+
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ']);
ExecutaSQL(['Select ''Existe'' Sim ',
'From Clientes',
'Where CliCod = '''+AdoQueryCliCod.AsString+''' ']);
Versões melhoradas:
Pesquisar ignorando oque está em uma string:
ExecutaSQL(?<r>\((?>('[^']*?'|[^'()])+|(?P>r))*\))
Selecionar somente após o primeiro parâmetro ser consumido:
ExecutaSQL(?<r>\((?>('[^']*?'|(?(R&r)[^'()]|[^,'()]))+|(?P>r))*\K('[^']*?'|[^'()])*\))
Somente as que não usam vetor de string:
ExecutaSQL(?!\(\[)(?<r>\((?>('[^']*?'|(?(R&r)[^'()]|[^,'()]))+|(?P>r))*\K('[^']*?'|[^'()])*\))
Considerando também as que usam mas desconsiderando tudo dentro do vetor:
ExecutaSQL(?<r>\((?>('[^']*?'|\[[^\]]*\]|(?(R&r)[^'()]|[^,'()]))+|(?P>r))*\K('[^']*?'|[^'()])*\)) Esse aqui remove um parâmetro desnecessário por já estar descrito no Default da procedure/function: (ExecutaSQL|RetornaSQL\w*)(?<r>\((?>('[^']*?'|\[[^\]]*\]|(?(R&r)[^'()]|[^,'()]))+|(?P>r))*\K(?(R&r)\)|, *FormMain\.DataBase(?=\)))) Remove linha vazia desnecessária: (ExecutaSQL|RetornaSQL\w*)(?=(?<r>\((?>('[^']*?'|\[[^\]]*\]|(?(R&r)[^'()]|[^,'()]))+|(?P>r))*(?(R&r)\)|(?<= '') *\))))(?s)((?!''\)).)+\K\+\r\n *''
Esse aqui localiza todos ignorando comentários, que possuem somente 1 parametro informado:
(ExecutaSQL|RetornaSQL\w*)(?!(?<r>\((?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|(?(R&r)[^'()]|[^,'()]))+|(?P>r))*(?(R&r)\)|,)))(?<r>\((?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|[^'()])+|(?P>r))*\))
Versão da anterior sem quebra de linha:
(ExecutaSQL|RetornaSQL\w*)(?!(?<r>\((?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|(?(R&r)[^'()\r\n]|[^,'()\r\n]))+|(?P>r))*(?(R&r)\)|,)))(?<r>\((?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|[^'()\r\n])+|(?P>r))*\))
Corrigindo:
L: (ExecutaSQL|RetornaSQL\w*)(?!\(\[)(?!(?<r>\((?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|(?(R&r)[^'()\r\n]|[^,'()\r\n]))+|(?P>r))*(?(R&r)\)|,)))(?<r>(?(R&r)\(|\(\K)(?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|[^'()\r\n])+|(?P>r))*(?(R&r)\)|(?=\))))
S: [$0]
Regex genérico para equalizar espaçamento VERTICAL! Foi dificílimo, mas finalmente consegui uma versão funcional em casos simples de poucas linhas:
L:(?=.*\QRetornaSQL([\E)^ (?<S>(?<!\QRetornaSQL([\E).(?:(?P>S)|.*\r\n)(?<I> |[^\r\n\]]*\r\n(?P>I)))(?! )\K
S:
Versão otimizada:
L:(?=.*\QRetornaSQL([\E)^ (?<S>(?<!\QRetornaSQL([\E).(?:(?P>S)|([^\r\n\]]*\r\n)+) )(?! )
S:$0
ou
L:(?=.*\QRetornaSQL([\E)^ (?<S>(?<!\QRetornaSQL([\E).(?:(?P>S)|([^\r\n\]]*\r\n)+) )(?! )\K
S:
Olha que retrocesso lindo:
RetornaSQL([
^
Não conseguiu combinar por que tinha menos caracteres ainda que o previsto (ter um a menos).
RetornaSQL([
^ ----> Ele retrocedeu e vai tentar daqui pra frente, com uma recursão a menos.
Isso claramente não foi intencional quando eu fiz, foi meio que na sorte.
Exemplo de uso:
Convertendo cadeia de strings em vetor de strings.
L1:(ExecutaSQL|RetornaSQL\w*)(?![ \(\r\n]*Concate\()(?!\(\[)(?!(?<r>\((?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|(?(R&r)[^'()]|[^,'()]))+|(?P>r))*(?(R&r)\)|,)))(?!(?<r>(?(R&r)\(|\(\K)(?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|[^'()\r\n])+|(?P>r))*(?(R&r)\)|(?=\)))))(?<r>(?(R&r)\(|\(\K)(?>(//[^\r\r]*|'[^']*?'|\[[^\]]*\]|[^'()])+|(?P>r))*(?(R&r)\)|(?=\))))
S1:[$0]
L2:(ExecutaSQL|RetornaSQL\w*)\(\[[^\]]+\K\+ *FimLinhaStr *\+ *(?=\r\n)
S2:,
Acertando espaçamento:
Regex utilizado:
L3:(?=.*\QRetornaSQL([\E)^ (?<S>(?<!\QRetornaSQL([\E).(?:(?P>S)|([^\r\n\]]*\r\n)+) )(?! )\K
S3:
DESCARTE:
L:(?=^.*?RetornaSQL)^ +(?# inicio recursão)(?<espacos>.(?(?<!RetornaSQL\(\[)(?P>espacos)|)(?# meio recursao)(?<R>(:? |[^\r\n\]]*\r\n(?P>R))))(?# fim recursao)(?! )\K
S:
((?=^.*?RetornaSQL)^ (?<R>(?<!\(\[).((?P>R)|.*\r\n) ))((?<f> +)|)
$1?{f}$+{f}:
^(?=^(?>(?<S> (?:(?P>S)|.*\r\n) ))) *
Comentários
Postar um comentário