1. ホーム
  2. regex

[解決済み] Microsoft Excelで正規表現(Regex)をセル内とループの両方で使用する方法

2022-03-14 10:43:54

質問

Excelで正規表現を使用し、Excelの強力なグリッドのような設定をデータ操作に活用するにはどうすればよいですか?

  • マッチしたパターンや置換された値を文字列で返すセル内関数。
  • データ列をループし、隣接するセルとのマッチングを抽出するサブ。
  • どのような設定が必要ですか?
  • Excelの正規表現の特殊文字とは何ですか?

Regexが多くの状況で理想的でないことは理解しています( 正規表現を使うか使わないか? を使用することができるためです。 Left , Mid , Right , Instr というコマンドで同様の操作ができます。

どのように解決するのですか?

正規表現 はパターンマッチングに使用されます。

Excelで使用する場合は、以下の手順で行います。

ステップ1 : Microsoft VBScript Regular Expressions 5.5" へのVBAリファレンスを追加します。

  • 開発者]タブを選択します。 このタブがないのですが、どうしたらいいですか? )
  • コード」リボンセクションからquot;Visual Basic"アイコンを選択します。
  • Microsoft Visual Basic for Applicationsのウィンドウで、トップメニューから[ツール]を選択します。
  • 参照」を選択します。
  • Microsoft VBScript Regular Expressions 5.5"の横にあるチェックボックスをオンにし、ワークブックに含めます。
  • OK"]をクリックします。

ステップ2 : パターンを定義する

基本的な定義

- 範囲を指定します。

  • a-z a から z までの小文字にマッチします。
  • 0-5 は0から5までの任意の数字にマッチします

[] この括弧の中にあるオブジェクトのうち、正確に1つにマッチします。

  • [a] は文字aにマッチします
  • [abc] は、a,b,c のいずれかの一文字にマッチします。
  • [a-z] はアルファベットの小文字1文字にマッチします。

() 返送のために異なるマッチをグループ化します。 以下の例を参照してください。

{} その前に定義されたパターンを繰り返しコピーするための乗算器。

  • [a]{2} は2つの連続した小文字のaにマッチします。 aa
  • [a]{1,3} は、少なくとも1つ、最大3つの小文字にマッチします。 a , aa , aaa

+ その前に定義されたパターンの少なくとも1つ以上にマッチする。

  • a+ は連続した a にマッチします。 a , aa , aaa などなど

? その前に定義されたパターンの0個または1個にマッチする。

  • 例:パターンはあってもなくてもよいが、1回だけマッチする。
  • [a-z]? は、空の文字列または任意の小文字1文字にマッチします。

* その前に定義されたパターンの0個以上にマッチする。

  • 例:存在してもしなくてもよいパターンに対するワイルドカード。
  • [a-z]* は、空の文字列または小文字の文字列にマッチします。

. 改行以外の文字にマッチする \n

  • a. a で始まり、a 以外のもので終わる2文字の文字列にマッチします。 \n

| OR演算子

  • a|b は、以下のどちらかを意味します。 a または b が一致することがあります。
  • red|white|orange は、ちょうど1つの色にマッチします。

^ NOT演算子

  • [^0-9] 文字に数字を含めることはできません
  • [^aA] 文字は小文字にできません a または大文字 A

\ 後に続く特殊文字をエスケープする(上記の動作より優先される)

  • \. , \\ , \( , \? , \$ , \^

アンカーリング・パターン

^ 文字列の先頭で一致すること

  • ^a 最初の文字は必ず小文字で a
  • ^[0-9] 1文字目は数字でなければならない。

$ 文字列の末尾にマッチすること

  • a$ 最後の文字は必ず小文字で a

優先順位表。

Order  Name                Representation
1      Parentheses         ( )
2      Multipliers         ? + * {m,n} {m, n}?
3      Sequence & Anchors  abc ^ $
4      Alternation         |


定義済みの文字略語。

abr    same as       meaning
\d     [0-9]         Any single digit
\D     [^0-9]        Any single character that's not a digit
\w     [a-zA-Z0-9_]  Any word character
\W     [^a-zA-Z0-9_] Any non-word character
\s     [ \r\t\n\f]   Any space character
\S     [^ \r\t\n\f]  Any non-space character
\n     [\n]          New line


例1 : マクロとして実行する

次のサンプルマクロは、セル A1 最初の1文字か2文字が数字であるかどうかを確認します。 もしそうなら、それらは取り除かれ、残りの文字列が表示される。 そうでない場合は、一致するものがないことを伝えるボックスが表示される。 セル A1 の値は 12abc が返されます。 abc の値は 1abc を返します。 abc の値は abc123 は、数字が文字列の先頭にないため、"Not Matched"を返します。

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range
    
    Set Myrange = ActiveSheet.Range("A1")
    
    If strPattern <> "" Then
        strInput = Myrange.Value
        
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With
        
        If regEx.Test(strInput) Then
            MsgBox (regEx.Replace(strInput, strReplace))
        Else
            MsgBox ("Not matched")
        End If
    End If
End Sub


例2 : セル内関数として実行する

この例は例1と同じですが、セル内関数として実行されるように設定されています。使用するには、コードを次のように変更します。

Function simpleCellRegex(Myrange As Range) As String
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim strReplace As String
    Dim strOutput As String
    
    
    strPattern = "^[0-9]{1,3}"
    
    If strPattern <> "" Then
        strInput = Myrange.Value
        strReplace = ""
        
        With regEx
            .Global = True
            .MultiLine = True
            .IgnoreCase = False
            .Pattern = strPattern
        End With
        
        If regEx.test(strInput) Then
            simpleCellRegex = regEx.Replace(strInput, strReplace)
        Else
            simpleCellRegex = "Not matched"
        End If
    End If
End Function

文字列("12abc")をセルに配置します。 A1 . この数式を入力します。 =simpleCellRegex(A1) セル内の B1 で、結果は "abc" になります。


例3 : ループスルー範囲

この例は、例1と同じですが、セルの範囲をループしています。

Private Sub simpleRegex()
    Dim strPattern As String: strPattern = "^[0-9]{1,2}"
    Dim strReplace As String: strReplace = ""
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range
    
    Set Myrange = ActiveSheet.Range("A1:A5")
    
    For Each cell In Myrange
        If strPattern <> "" Then
            strInput = cell.Value
            
            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With
            
            If regEx.Test(strInput) Then
                MsgBox (regEx.Replace(strInput, strReplace))
            Else
                MsgBox ("Not matched")
            End If
        End If
    Next
End Sub


例4 : 異なるパターンを分割する

この例では、ある範囲( A1 , A2 & A3 で始まり、3桁で始まり、アルファベット1文字、数字4桁の文字列を探します。 出力は、パターンマッチを隣接するセルに分割するために () . $1 の最初のセットの中でマッチした最初のパターンを表します。 () .

Private Sub splitUpRegexPattern()
    Dim regEx As New RegExp
    Dim strPattern As String
    Dim strInput As String
    Dim Myrange As Range
    
    Set Myrange = ActiveSheet.Range("A1:A3")
    
    For Each C In Myrange
        strPattern = "(^[0-9]{3})([a-zA-Z])([0-9]{4})"
        
        If strPattern <> "" Then
            strInput = C.Value
            
            With regEx
                .Global = True
                .MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern
            End With
            
            If regEx.test(strInput) Then
                C.Offset(0, 1) = regEx.Replace(strInput, "$1")
                C.Offset(0, 2) = regEx.Replace(strInput, "$2")
                C.Offset(0, 3) = regEx.Replace(strInput, "$3")
            Else
                C.Offset(0, 1) = "(Not matched)"
            End If
        End If
    Next
End Sub

結果


その他のパターン例

String   Regex Pattern                  Explanation
a1aaa    [a-zA-Z][0-9][a-zA-Z]{3}       Single alpha, single digit, three alpha characters
a1aaa    [a-zA-Z]?[0-9][a-zA-Z]{3}      May or may not have preceding alpha character
a1aaa    [a-zA-Z][0-9][a-zA-Z]{0,3}     Single alpha, single digit, 0 to 3 alpha characters
a1aaa    [a-zA-Z][0-9][a-zA-Z]*         Single alpha, single digit, followed by any number of alpha characters

</i8>    \<\/[a-zA-Z][0-9]\>            Exact non-word character except any single alpha followed by any single digit