excel vba - regex multilinii nie działa


2

W komórce A1 arkusza programu Excel mam następującą zawartość w komórce:

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

Każdy z poniższych wyników jest pożądany:

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

LUB

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

Mam ten kod 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

Ale okno komunikatu wyświetla dokładny tekst z komórki A1 (tzn. Bez wymiany). Czy ktoś wie, dlaczego tak się dzieje? Nie będę w stanie zastąpić wielu linii.

Wiem, że mój kod wyrażenia regularnego jest w porządku, ponieważ próbowałem zmienić komórkę A1 na niższą (i to zrobiło to poprawnie):

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

Odpowiedzi:



4

Twój problem jest prawdopodobnie dlatego, .że nie pasuje do nowych linii (nie jestem pewien, ale .MultiLine powinienem zmienić to zachowanie? Z jakiegokolwiek powodu może nie mieć, więc spróbuj tego.)

Próbować:

select.+\n*from

Albo może:

select.+\r\n*from

Nawet lepiej:

select[\s\S]+from

Również:

select[\u0000-\uFFFF]+from

Pierwsze dwa oznaczają pasują do wszystkiego oprócz nowych linii, a także pasują do nowych linii na określonej pozycji. Dwa ostatnie oznaczają, że pasują do wszystkiego, łącznie z nowymi liniami.


1
+1 dla select[\s\S]+from.
brettdj

2

Istnieją dwa problemy:

  1. Wzorzec wyrażenia regularnego nie pasuje do nowej linii (jak już wspomniano inni): użyj
    objRegExp.Pattern = "select\s.+\sfrom" ( \saby dopasować białe znaki, w tym nowe linie)
  2. Zmień wzór zastępowania, "select 1" & vbNewLine & "from"aby wstawić nowy wiersz w żądanym miejscu
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.