web-dev-qa-db-ja.com

Excelvba-複数行の正規表現が機能しない

ExcelシートのセルA1には、セル内に次の内容があります。

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

以下のいずれかが望ましい結果です。

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
;

私はこの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

ただし、メッセージボックスには、セルA1からの正確なテキストが表示されています(つまり、置換は行われません)。なぜこれが起こっているのか誰かが知っていますか?マルチライン間で置き換えることはできません。

セルA1を以下に変更しようとしたので、正規表現コードに問題がないことはわかっています(そして、正しく置き換えられました)。

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

あなたの問題はおそらく.改行と一致しません(わかりませんが、.MultiLineshouldその振る舞いを変更しましたか?何らかの理由で、持っていない可能性があるので、これを試してください。).

試してみてください:

select.+\n*from

または多分:

select.+\r\n*from

さらに良い:

select[\s\S]+from

また:

select[\u0000-\uFFFF]+from

最初の2つの平均は、改行を除くすべてに一致し、特定の位置の改行にも一致します。最後の2つの意味は、改行を含むすべてに一致します。

4
Bob

この正規表現で試してください

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

2つの問題があります:

  1. 正規表現パターンが改行と一致しません(他の人が言及しているように):使用
    objRegExp.Pattern = "select\s.+\sfrom"\sは、新しい行を含め、空白に一致します)
  2. 置換パターンを"select 1" & vbNewLine & "from"に変更して、必要な場所に新しい行を挿入します
2
chris neilsen