みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VBAで改行の入ったデータの正規表現について

vbaで複数行のデータの一部を抜き出そうと思っています。
下記のようにすると、抜き出したデータの先頭に改行がついてしまいます。
何かいい方法はないでしょうか。


data = "start" & vbCrLf  & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf & "end"

Set re = New RegExp

re.Pattern = "start((.|\n)*?)end"

re.MultiLine = True

Set mc = re.Execute(data)

For i = 0 To mc.Count - 1

MsgBox m.SubMatches(0)

Next i


上記を実行すると

vbCrLf  & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf

となってしまいます。

”ABC”から抜き出す場合、正規表現をどう書けばいいのでしょうか。
よろしくお願いします。

投稿日時 - 2014-10-05 21:56:18

QNo.8780307

すぐに回答ほしいです

質問者が選んだベストアンサー

こんにちは。

vbCrLfを表すパターンは、
 \r\n
です。

Sub Re8780307()
Dim re As VBScript_RegExp_55.RegExp
Dim mc As VBScript_RegExp_55.MatchCollection
Dim m As VBScript_RegExp_55.Match
Dim Data
  Data = "start" & vbCrLf & "ABC" & vbCrLf & "DEF" & vbCrLf & "GHI" & vbCrLf & "end" & vbCrLf & _
    "start" & vbCrLf & "JKL" & vbCrLf & "MNO" & vbCrLf & "PQR" & vbCrLf & "end"
  
  Set re = New RegExp
  re.Global = True
  re.MultiLine = True
  re.Pattern = "start(\r\n((.|\r\n)*?)\r\n)end"
  
  Set mc = re.Execute(Data)
  For Each m In mc
    Debug.Print "■"; m.SubMatches(1); "■"
  Next
End Sub

みたいなことをなさりたいのでは?

投稿日時 - 2014-10-06 12:23:01

お礼

ありがとうございます。

すっかり、「¥r」の存在を忘れていました。
たぶん、これでスッキリ解決だと思います。
今からテストしてみます。

投稿日時 - 2014-10-06 20:23:18

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

> re.Pattern = "start((.|\n)*?)end"
ここでstartの後の改行をかっこの外に出しておくべきなのでは?
re.Pattern = "start\n((.|\n)*?)end"

投稿日時 - 2014-10-06 01:30:51

お礼

ありがとうございます。

今回、質問に書いたプログラムと、実際のプログラムは少し違います。
プログラムの一部を、簡略化しています。

実際は、正規表現でマッチしたのを、分割してコレクションに入れています。
その分割したデータを、再分割するところのプログラムが、今回質問したところです。

そこでは、なぜか正規表現がうまくマッチしません。

>re.Pattern = "start\n((.|\n)*?)end"

これも試してみましたが、startの文字を入れるとマッチしなくなります。
どうも、コレクションの挙動がおかしいので、その辺から見直してみます。
ありがとうございました。

投稿日時 - 2014-10-06 07:50:16

あなたにオススメの質問