正規表現で文字列中から指定の文字列を検索し、見つかったら、その文字列を返す
パラメータ対象文字列 | 検索対象文字列 |
パターン | 検索する文字列を正規表現で指定(正規表現の記述方法) |
取得位置 | 複数ある場合に、その番目を指定(1~)、省略時は1番目 |
見つかった文字列、見つからなかった場合は空白。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | Function MyRegText(対象文字列 As String , パターン As String , Optional 取得位置 As Integer = 1) As String ' ' 正規表現による検索 ' ' 入力 ' 対象文字列:対象文字列 ' パターン :検索正規表現パターン ' 取得位置 :取得するマッチ番号(1~) ' ' 戻り値 :見つかった文字列 ' MyRegText = "" Dim reMatch As MatchCollection 'マッチ結果格納用オブジェクト Dim reSubMatches As SubMatches 'サブマッチコレクション格納用 With re .Pattern = パターン .IgnoreCase = True '大小文字の区別無し .Global = True '文字列全体を検索 If re.Test(対象文字列) Then 'テスト マッチ? Set reMatch = .Execute(対象文字列) If reMatch.Count >= 取得位置 Then Set reSubMatches = reMatch.Item(取得位置 - 1).SubMatches If reSubMatches.Count > 0 Then MyRegText = reSubMatches(0) Else MyRegText = reMatch.Item(取得位置 - 1) 'マッチ文字列 End If End If End If End With End Function |
正規表現オブジェクトを使用するため、「参照設定」をしておく必要があります。
(CreateObjectで作成すれば参照設定の必要は無いが、入力チェックや支援が行われないので設定した方が便利。)
MyRegText(E15,"^.{2,3} [都道府県]")
^ :行頭を表す。この場合、対象文字列の先頭
. :任意の1文字
{2,3} :直前に指定した正規表現(本例では「.」)が2文字以上3文字以内で連続
[都道府県]:[ ]内に記述されたいずれかの1文字
^.{2,3}[都道府県]:対象文字列の先頭から2、3文字の後に続く、都道府県のいずれかの1文字まで
MyRegText(E15,"^.{2,3} [都道府県](.*)")
これは、都道府県の後に続く文字列を取り出している。
( ):グループ化。括弧がある場合、その括弧の内側の文字列が取り出される。
* :0個以上の繰り返し
.* :任意の文字が0個以上続く
MyRegText("0"&$B8&"0","0([^0]{4})0",2)
この例は、0以外の文字が4個連続する文字列の2番目の文字列を取り出している。
下図の例では、4441 , 4442 , 4443 の3個が存在するので、2番目は、4442 となる。
[^0]
:0以外の1文字。[]内の「^」は否定を表す。
[^0]{4} :0以外の文字が4個連続
0([^0]{4})0 :両端が「0」である「0」以外の連続する4文字
対象文字列を"0"&$B7&"0"
としているのは、探す文字列が先頭、または末尾にある場合の対処。
端にある場合は「0」で挟まれていないので、対象文字列の両端に「0」を付加している。
正規表現で文字列中から指定の文字列を検索し、みつかった文字列の個数を返す
(注:文字列の長さではない)
対象文字列 | 検索対象となる文字列 |
パターン | 検索する文字列を正規表現で指定(正規表現の記述方法) |
見つかった文字列の個数、見つからなかった場合は0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Function MyRegCount(対象文字列 As String , パターン As String ) As Integer ' ' 正規表現による検索 ' ' 入力 ' 対象文字列:対象文字列 ' パターン :検索正規表現パターン ' ' 戻り値 :見つかった個数 ' MyRegCount = 0 Dim reMatch As MatchCollection 'マッチ結果格納用オブジェクト With re .Pattern = パターン .IgnoreCase = True '大小文字の区別無し .Global = True '文字列全体を検索 If re.Test(対象文字列) Then 'テスト マッチ? Set reMatch = .Execute(対象文字列) '発見 MyRegCount = reMatch.Count 'マッチ個数セット End If End With End Function |
MyRegCount("0"&$B7&"0","0([^0]{4})0")
この例は、0以外の文字が4個連続する文字列の個数を調べている。
下図の例では、4441 , 4442 , 4443 の3個が存在するので、3が返っている
[^0]
:0以外の1文字。[]内の「^」は否定を表す。
[^0]{4} :0以外の文字が4個連続
0([^0]{4})0 :両端が「0」である「0」以外の連続する4文字
対象文字列を"0"&$B7&"0" としているのは、探す文字列が先頭、または末尾にある場合の対処。
端にある場合は「0」で挟まれていないので、対象文字列の両端に「0」を付加している。
MyRegCount ("0"&$B18&"0","[^休]休{2}[^休]")
シフト表を模した文字列から、2連休の個数を求めている。
対象文字列を"0"&$B18&"0" としているのは、前項と同じく、探す文字列が先頭、または末尾にある場合の対処
MyRegCount("休"&$B18&"休","休[^休]{3}休")
シフト表を模した文字列から、3日連続する勤務を求めている(注:4連勤以上は含まない)
「休」に挟まれた「休」以外の連続する3個の文字列
ファイルパスから、フォルダパス、ファイル名を正規表現関数 MyRegText で取り出してみます。
フォルダパスを取得する正規表現
正規表現で文字列中から指定の文字列を検索し、みつかった文字列を置換文字列で置き換えます。
パラメータ対象文字列 | 検索対象となる文字列 |
パターン | 検索する文字列を正規表現で指定(正規表現の記述方法) |
置換文字列 | 置換する文字列 |
置換後の文字列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Public Function MyRegReplace( ByVal 対象文字列 As String , ByVal パターン As String , ByVal 置換文字列 As String ) As String ' ' 正規表現による置換 ' ' 対象文字列:対象となる文字列 ' パターン :検索正規表現パターン ' 置換文字列:置換する文字列 ' MyRegReplace = 対象文字列 Dim reMatch As MatchCollection 'マッチ結果格納用オブジェクト Dim reSubMatches As SubMatches 'サブマッチコレクション格納用 With re .Pattern = パターン .IgnoreCase = True '大小文字の区別無し .Global = True '文字列全体を検索 If re.Test(対象文字列) Then 'テスト Set reMatch = .Execute(対象文字列) '発見 MyRegReplace = re.Replace(対象文字列, 置換文字列) '置換 End If End With End Function |
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub RegisterMyFunction() Application.MacroOptions Macro:= "MyRegText" , Description:= "正規表現によりパターンにマッチする文字列を検索します" , _ Category:= "文字列操作" , ArgumentDescriptions:=Array( "対象文字列" , "正規表現パターン" , "取得するマッチ番号(1~)" ), _ HelpFile:= "../../../../kyozai/excel_vba/300_vba_kiso/80_regex/index.htm?MyRegText" Application.MacroOptions Macro:= "MyRegCount" , Description:= "正規表現によりパターンにマッチした個数を返します。" , _ Category:= "文字列操作" , ArgumentDescriptions:=Array( "対象文字列" , "正規表現パターン" ), _ HelpFile:= "../../../../kyozai/excel_vba/300_vba_kiso/80_regex/index.htm?MyRegCount" Application.MacroOptions Macro:= "MyRegReplace" , Description:= "正規表現によりパターンにマッチする文字列を検索します" , _ Category:= "文字列操作" , ArgumentDescriptions:=Array( "対象文字列" , "正規表現パターン" , "置換後の文字列" ), _ HelpFile:= "../../../../kyozai/excel_vba/300_vba_kiso/80_regex/index.htm?MyRegRep" End Sub |