excel vba - regex de múltiplas linhas não funciona

1

Na célula A1 de uma planilha do Excel, tenho o seguinte conteúdo dentro da célula:

select a.id, b.type, c.name 
from blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;

Qualquer um dos abaixo são resultados desejados:

select 1 from
blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;

OR

select 1
from blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;

Eu tenho esse código vba

    Dim objRegExp As New RegExp
    objRegExp.Pattern = "select .+ from"
    objRegExp.Global = True
    objRegExp.MultiLine = True
    regexpReplace =objRegExp.Replace(Trim(Worksheets("new").Range("A1").Value),"select 1 from")
MsgBox regexpReplace

Mas a caixa de mensagem está exibindo o texto exato da célula A1 (ou seja, sem substituição). Alguém sabe por que isso está acontecendo? Eu não serei capaz de substituir entre multilinhas.

Eu sei que meu código de regex está ok porque tentei alterar a célula A1 para o abaixo (e ele fez o substituto corretamente):

select a.id, b.type, c.name from
blah a, 
blah2 b, 
blah3 c
where a.id = b.key
and b.key = c.id
;
    
por toop 11.03.2012 / 05:57

3 respostas

3

Tente com esta regex

select (.*?)[\r\n|\s]from
    
por 11.03.2012 / 06:29
3

Seu problema é provavelmente porque . não corresponde a novas linhas (não tenho certeza, mas .MultiLine deveria ter alterado esse comportamento? Por alguma razão, pode não ter sido, então tente isso.).

Tente:

select.+\n*from

Ou talvez:

select.+\r\n*from

Melhor ainda:

select[\s\S]+from

Além disso:

select[\u0000-\uFFFF]+from

As duas primeiras médias correspondem a tudo, exceto as novas linhas, e também correspondem a novas linhas em uma posição específica. As duas últimas médias correspondem a tudo, incluindo novas linhas.

    
por 11.03.2012 / 06:24
1

Existem dois problemas:

  1. O padrão de expressão regular não corresponde à Nova Linha (como outros já mencionaram): use objRegExp.Pattern = "select\s.+\sfrom" ( \s para corresponder ao espaço em branco, incluindo novas linhas)
  2. Altere o padrão de substituição para "select 1" & vbNewLine & "from" para inserir a nova linha onde desejar
por 11.03.2012 / 06:33