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

Postagens mais visitadas deste blog

REGEX APLICADO