2 votos

excel vba - regex multilínea no funciona

En la celda A1 de una hoja de Excel tengo el siguiente contenido dentro de la celda:

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

Cualquiera de los siguientes son los resultados deseados:

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

O

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

Tengo este 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

Pero el cuadro de mensajes muestra el texto exacto de la celda A1 (es decir, sin que se produzca ninguna sustitución). ¿Alguien sabe por qué ocurre esto? Quiero poder reemplazar en varias líneas.

Sé que mi código regex está bien porque he probado a cambiar la celda A1 por la de abajo (y ha hecho el reemplazo correctamente):

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

4voto

notFound Puntos 41

Su problema es probablemente porque . no coincide con las nuevas líneas (no estoy seguro, pero .MultiLine debe ¿ha cambiado ese comportamiento? Por la razón que sea, puede que no lo haya hecho, así que prueba esto).

Inténtalo:

select.+\n*from

O tal vez:

select.+\r\n*from

Incluso mejor:

select[\s\S]+from

También:

select[\u0000-\uFFFF]+from

Los dos primeros significan que coinciden con todo excepto las nuevas líneas, y también coinciden con las nuevas líneas en una posición específica. Las dos últimas significan que coinciden con todo, incluidas las nuevas líneas.

4voto

Siva Charan Puntos 2694

Prueba con esta regex

select (.*?)[\r\n|\s]from

2voto

chris neilsen Puntos 3175

Hay dos cuestiones:

  1. El patrón regex no coincide con la Nueva Línea (como otros han mencionado): utilice
    objRegExp.Pattern = "select\s.+\sfrom" ( \s para que coincida con los espacios en blanco, incluidas las líneas nuevas)
  2. Cambia el patrón de sustitución por "select 1" & vbNewLine & "from" para insertar la nueva línea donde quieras

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: