Excelスキルアップコレクション
           〜 Something U Want 〜


Google  

WWW を検索
Excelスキルアップコレクション内 を検索
 @     Top  >     Excel VBA スキルアップコレクション Topics  >     (35) 正規表現を使って文字列を調べる

 
(35) 正規表現を使って文字列を調べる

 VBAでは「Microsoft VBScript Regular Expressions 5.5」を参照設定することで、文字列操作にて高度な正規表現を用いることができるようになります。

 VBAのメニューから[ツール(T)] > [参照設定(R)] を選択します。『参照設定』画面が開きます。


 『参照設定』画面から「Microsoft VBScript Regular Expressions 5.5」を選択して、[OK]ボタンをクリックします。


 「Microsoft VBScript Regular Expressions 5.5」を参照することでRegExpオブジェクトを利用できるようになります。RegExpオブジェクトを使った、次のRegExp_01ファンクションを用意します。

 1行目:  Public Function RegExp_01( _
 2行目:        pPattern As String _
 3行目:      , pStr As String _
 4行目:      , pIgnoreCase As String _
 5行目:  ) As String
 6行目:  
 7行目:      ' 戻り値作成用変数
 8行目:      Dim ret As String
 9行目:  
10行目:      ' RegExpオブジェクトを作成する。
11行目:      Dim regEx As New RegExp
12行目:  
13行目:      ' 正規表現を定義するために使用される文字列を設定する。
14行目:      regEx.Pattern = pPattern
15行目:      
16行目:      ' 大文字小文字の区別をする・しないを設定する。
17行目:      regEx.IgnoreCase = pIgnoreCase
18行目:      
19行目:      ' 文字列内の可能なすべての一致に対してテストする。
20行目:      regEx.Global = True
21行目:      
22行目:      ' 正規表現チェック結果のコレクションを取得する。
23行目:      Dim col As IMatchCollection2
24行目:      Set col = regEx.Execute(pStr)
25行目:      
26行目:      ' 正規表現に一致したものを一つずつ参照する。
27行目:      Dim Match As IMatch2
28行目:      For Each Match In col
29行目:         ret = ret & Match.FirstIndex & "番目に '" _
30行目:          & Match.Value & " 'を発見。" & vbCrLf
31行目:      Next
32行目:  
33行目:      ' 戻り値を返す。
34行目:      RegExp_01 = ret
35行目:  
36行目:  End Function
※「Microsoft VBScript Regular Expressions 5.5」を参照設定せずに、次のようにCreateObject関数を使ってRegExpオブジェクトを生成することもできます。

・・・
 9行目:      ' RegExpオブジェクトを生成する。
10行目:      Dim regEx As Object
11行目:      Set regEx = CreateObject("VBScript.RegExp")
・・・
 RegExpオブジェクトのプロパティとメソッドを紹介します。
RegExp.Patternプロパティ
 正規表現を定義する文字列です。これは正規表現の処理をする前に設定しておく必要があります。
RegExp.IgnoreCaseプロパティ
 正規表現にて大文字小文字を区別するかどうかを示すプロパティです。デフォルトでは、False が設定されています。
RegExp.Globalプロパティ
 正規表現を文字列内のすべての可能な一致に対してテストするかどうかを示すプロパティです。デフォルトでは、False に設定されています。
RegExp.Testメソッド
構文:RegExp.Test( [文字列] )

 文字列が正規表現に一致している場合にはTrue、そうでない場合はFalseを返します。
RegExp.Replaceメソッド
構文:RegExp.Replace( [検索文字列], [置換文字列] )

 検索文字列の中で正規表現に一致した箇所を置換文字列で置き換えて返します。一致がない場合は元の文字列をそのまま返します。
RegExp.Executeメソッド
構文:RegExp.Execute( [検索文字列] )

 検索文字列の中で正規表現に一致した箇所をIMatchCollection2というコレクションで返します。このコレクションはIMatch2オブジェクトの集合です。
 IMatch2オブジェクトのプロパティも紹介します。
IMatch2.FirstValueプロパティ
 正規表現に一致した文字列の位置を示します。位置は左端を0として番号付けられます。
IMatch2.Legthプロパティ
 正規表現に一致した文字列の合計の長さを示します。
IMatch2.Valueプロパティ
 正規表現に一致した文字列を示します。
 RegExp_01ファンクションを呼出す次のプログラムを用意して実行します。ここで行う正規表現による処理は、大文字小文字の違いを無視して、「go」もしくは「went」に一致する文字列を調べています。

 1行目:  Option Explicit
 2行目:  
 3行目:  Public Sub Sample_RegExp_01()
 4行目:      
 5行目:      ' 五味さんはシカゴへ行った。
 6行目:      MsgBox RegExp_01( _
 7行目:                    "(go|went)" _
 8行目:                  , "Mr.Gomi went to Chicago." _
 9行目:              ), vbOKOnly
10行目:  
11行目:  End Sub
 Sample_RegExp_01()を実行します。


 正規表現に使用する表記方法を次の表にまとめました。
 OnKeyメソッドのキーに指定した「^」は[Ctrl]ボタン、「m」は[m]ボタンを表わしています。キーの指定に使うボタンの表現方法を紹介します。

シンボル種別説明
^位置一致文字列の先頭に一致
$位置一致文字列の末尾に一致
¥b位置一致任意の単語境界に一致
¥B位置一致任意の単語境界以外の位置に一致
英数字リテラル英字と数字に一致
¥nリテラル改行に一致
¥fリテラルフォーム フィードに一致
¥rリテラルキャリッジ リターンに一致
¥tリテラル水平タブに一致
¥vリテラル垂直タブに一致
¥?リテラル? に一致
¥*リテラル* に一致
¥+リテラル+ に一致
¥.リテラル. に一致
¥|リテラル| に一致
¥{リテラル{ に一致
¥}リテラル} に一致
¥¥リテラル¥ に一致
¥[リテラル[ に一致
¥]リテラル] に一致
¥(リテラル( に一致
¥)リテラル) に一致
¥xxxリテラル8進数 xxx によって表現されるASCII文字に一致
¥xddリテラル16進数 dd によって表現されるASCII文字に一致
¥uxxxxリテラルUNICODE xxxx によって表現されるASCII文字に一致
[xyz]文字クラス文字セットに含まれている任意の1文字に一致
[^xyz]文字クラス[^xyz] 文字セットに含まれていない任意の1文字に一致
.文字クラス¥n 以外の任意の文字に一致
¥w文字クラス単語に使用される任意の文字に一致(=[a-zA-Z_0-9])
¥W文字クラス単語に使用される文字以外の任意の文字に一致(=[^a-zA-Z_0-9])
¥d文字クラス任意の数字に一致(=[0-9])
¥D文字クラス任意の数字以外の文字に一致(=[^0-9]と等価)
¥s文字クラス任意のスペース文字に一致(=[ ¥t¥r¥n¥v¥f])
¥S文字クラス任意の非スペース文字に一致(=[^ ¥t¥r¥n¥v¥f])
{x}文字クラス正規表現のちょうど x個の直前の文字に一致
{x,}文字クラス正規表現のx個以上の直前の文字に一致
{x,y}文字クラス正規表現のx個以上、y個以下の直前の文字に一致
?文字クラスゼロ個または1個の直前の文字に一致(={0,1})
*文字クラスゼロ個以上の直前の文字に一致(={0,})
+文字クラス1個以上の直前の文字に一致(={1,})
()選択とグループ化複数の句をグループ化して、1つの句を作成します。ネストすることができます。
|選択とグループ化選択は、複数の句を1つの正規表現にまとめ、これらのうちの任意の句に一致
()¥n後方参照n番目の括弧で囲まれた句に一致
ページの先頭へ