スポンサーリンク

【Excel/VBA】VBAで正規表現~いろいろ試してみる

VBA正規表現 vba
スポンサーリンク
※当サイトは広告を含みます

先日から、正規表現についていろいろ調べています。

やっぱりまだ暗号にしか見えない。

こちらの記事を参考にさせていただきいろいろと試してみて理解しようと努めてみました。

サルにもわかる正規表現入門 (mnet.ne.jp)

エクセルVBAでやってみました。

以下VBAのコード。検索結果をイミディエイトウインドウに番号とともに出力します。

 Dim re As RegExp     ‘正規表現クラスオブジェクト
 Set re = New RegExp

 ’検索対象文字列
 Dim s As String
 ’s = “らりるれろ123らんる4567らりるれろ”

 ’検索条件設定
 re.Global = True      ’検索範囲(True:文字列の最後まで検索)
 re.IgnoreCase = True    ’大文字小文字の区別(True:区別しない)
 re.Pattern = “らりるれろ”  ’検索パターン”

 ’検索結果を受け取るMatchesコレクション
 Dim vMatches As MatchCollection
 ’検索実行
 Set vMatches = re.Execute(s)

 ’コレクションをループ
 Dim i As Long, cnt As Long
 Dim vMatch As Match   ’検索結果オブジェクト
 cnt = vMatches.Count
 For i = 0 To cnt – 1
  Set vMatch = vMatches.Item(i)
  Debug.Print i & “:” & vMatch   ’番号と検索結果を出力
 Next i

テスト1 

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:らりるれろ

検索結果

 0:らりるれろ
 1:らりるれろ

文字列のうち下線の部分がヒットとなりました。

らりるれろ123らんる4567らりるれろ

「らりるれろ」に一致する部分ですね。

テスト2

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:[らりるれろ]

らりるれろに [ ] を付けました。[ ]内のいずれかの文字、ということになります。

検索結果

 0:ら
 1:り
 2:る
 3:れ
 4:ろ
 5:ら
 6:る
 7:ら
 8:り
 9:る
 10:れ
 11:ろ

文字列のうち下線の部分が一文字ずつヒットとなりました。

らりるれろ1234567らりるれろ

テスト3

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:(らりるれろ)

今度はらりるれろに ( ) を付けました。( ) はグループ化になるそうです。

検索結果

0:らりるれろ
1:らりるれろ

ぴったり「らりるれろ」と一致した部分だけがヒットとなりました。

テスト4

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:(らり|んる|123)

今度は「らり」と「らん」と「123」を探したいとします。その場合は探したい文字列を | で区切って指定します。

検索結果

0:らり
1:123
2:んる
3:らり

文字列のうち下線の部分がヒットとなりました。

らりるれろ123んる4567らりるれろ

テスト5

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:(らり|りる)

今度は「らり」と「りる」を検索してみました。

検索結果

0:らり
1:らり

「りる」はあるけど検出されませんでした。「らり」に「り」を取られてしまうともう「りる」は検索されないのですね。

テスト6

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:[ら-ろ]

上記の検索パターンでテスト2の[らりるれろ]と同義になります。

連続する文字は[0-9] [a-z]のように書けるそうです。

検索結果

 テスト2と同じ

テスト7

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:[ら-ろ0-9]

上記の書き方でら行と数字の検索となるようです。なんかこの辺がわかりにくい。

検索結果

0:ら
1:り
2:る
3:れ
4:ろ
5:1
6:2
7:3
8:ら
9:る
10:4
11:5
12:6
13:7
14:ら
15:り
16:る
17:れ
18:ろ

下線の部分がヒット

らりるれろ123らる4567らりるれろ

テスト8

文字列:らりるれろ123らんる4567らりるれろ

検索パターン:[ら-ろ]+ろ

検索結果

0:らりるれろ
1:らりるれろ

「+」は直前の指定文字の1文字以上の繰り返しを意味するそうです。

ら~ろの文字一文字以上かつ最後は「ろ」である文字列が検索されました。

テスト9

文字列:らろ123らんる4567らるろ

検索パターン:^[ら-ろ]+ろ

検索結果

0:らるろ

「$」は指定文字列で終わる文字列を意味するそうです。

下線の部分が検索されました。

らろ123らんる4567らるろ

最初の「らろ」はそのあとに文字が続くので検索されませんでした。

テスト10

文字列:らろ123らんる4567らるろ

検索パターン:^[ら-ろ]+ろ

検索結果

0:らろ

「^」は指定文字列で始まる文字列を意味するそうです。

下線の部分が検索されました。

らろ123らんる4567らるろ

行頭の「らろ」だけが検出されました。

テスト11

文字列:らろ123らんる4567らるろ

検索パターン:[ら-ろ]\d

「\d」は[0-9]と同義になるそうです。「数字」を意味します。「¥d」とも書きます。

検索結果

0:ろ1
1:る4

下線の部分が検索されました。

ろ123らんる4567らるろ

ラ行の一文字と数字一文字が連続した部分が検出されました。

テスト12

文字列:らろ123らんる4567らるろ

検索パターン:[ら-ろ]+\d+

「らーろ」と\dの後ろに「+」を加えました。「+」は直前の指定文字列の一文字以上の繰り返しです。

検索結果

0:らろ123
1:る4567

下線の部分が検索されました。

らろ123らんる4567らるろ

ラ行プラス数字の連続した部分が検出されました。

テスト13

文字列:らろ123らんる4567らるろ

検索パターン:[ら-ろ]+\d*

「\d」の後を「*」に変えました。「*」は直前の指定文字列のゼロ文字以上の繰り返しです。あってもなくてもいいということですね。

検索結果

0:らろ123
1:ら
2:る4567
3:らるろ

下線の部分が検索されました。

らろ123 る4567 らるろ

ラ行の一文字と数字一文字が連続した部分、およびラ行の部分が検出されました。

テスト14

文字列:らろ123らる4567らるろ

検索パターン:\d*[らりるれろ]+\d*

「\d*」で[ら-ろ]を挟みました。

検索結果

0:らろ123
1:らる4567
2:らるろ

下線の部分が検索されました。

らろ123 らろ4567 らるろ

わけがわからなくなってきた。例の文字列が悪いのだろうろうか。。。

テスト15

文字列:らろ123らる4567らるろ

検索パターン:\d+[らりるれろ]+\d+

数字の部分を「\d+」とすると数字ではさまれたラ行文字列が検出されます。

検索結果

0:123らる4567

下線の部分が検索されました。

らろ123らろ4567らるろ

テスト15

文字列:らろ123らる4567らるろ

検索パターン:\d?[らりるれろ]+\d?

数字の後を「?」に変えてみました。「?」は直前の文字が0個か1個か、だそうです。あるかないか。

検索結果

0:らろ1
1:3らる4
2:7らるろ

下線の部分が検索されました。

らろ123らろ4567らるろ

そろそろ終わりにしたいと思います。

ながながと書いたもののわかったようなわからないような。。。

正規表現は「慣れ」が必要だな、と思いました。

コメント

タイトルとURLをコピーしました