Microsoft Excel でセル内とループの両方で正規表現 (Regex) を使用する方法 質問する

Microsoft Excel でセル内とループの両方で正規表現 (Regex) を使用する方法 質問する

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

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

正規表現は多くの状況では理想的ではないことは理解しています(正規表現を使用するか、使用しないか?) Excel では、同様の操作に、、、 タイプのコマンドLeftを使用できるためです。MidRightInstr

ベストアンサー1

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

Excel で使用するには、次の手順に従ってください。

ステップ 1 : 「Microsoft VBScript Regular Expressions 5.5」への VBA 参照を追加します。

  • 「開発者」タブを選択します(このタブがありません。どうすればいいですか?
  • 「コード」リボンセクションから「Visual Basic」アイコンを選択します。
  • 「Microsoft Visual Basic for Applications」ウィンドウで、上部のメニューから「ツール」を選択します。
  • 「参考文献」を選択
  • ワークブックに含めるには、「Microsoft VBScript 正規表現 5.5」の横にあるボックスをオンにします。
  • 「OK」をクリック

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

基本的な定義:

-範囲。

  • 例:a-zaからzまでの小文字に一致します
  • 例: 0-50から5までの任意の数字に一致

[]これらの括弧内のオブジェクトの 1 つを正確に一致させます。

  • 例えば、[a]文字aに一致する
  • 例えば、[abc]a、b、cのいずれかの1文字に一致します。
  • たとえば、[a-z]アルファベットの小文字の 1 文字に一致します。

()返す目的で異なる一致をグループ化します。以下の例を参照してください。

{}前に定義されたパターンの繰り返しコピーの乗数。

  • たとえば、[a]{2}連続する 2 つの小文字 a に一致します。aa
  • 例えば、[a]{1,3}少なくとも1つ、最大3つの小文字の「,」に一致しますaaaaaa

+少なくとも 1 つ以上の前に定義されたパターンと一致します。

  • 例えば、連続a+するa、、などに一致しaます。aaaaa

?前に定義されたパターンの 0 個または 1 個と一致します。

  • たとえば、パターンは存在する場合も存在しない場合もありますが、一致できるのは 1 回だけです。
  • たとえば、[a-z]?空の文字列または任意の小文字 1 文字に一致します。

*前に定義されたパターンの 0 個以上と一致します。

  • 例: 存在する場合も存在しない場合もあるパターンのワイルドカード。
  • たとえば、[a-z]*空の文字列または小文字の文字列に一致します。

.改行以外の任意の文字に一致します\n

  • 例:a.aで始まり、a以外で終わる2文字の文字列に一致します。\n

|OR演算子

  • 例えば、または のいずれかが一致できることをa|b意味します。ab
  • たとえば、red|white|orange色のいずれか 1 つに正確に一致します。

^NOT演算子

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

\後続の特殊文字をエスケープします(上記の動作を上書きします)

  • \.、、、、、、\\\(\?\$\^

アンカーパターン:

^一致は文字列の先頭で発生する必要があります

  • 例:^a最初の文字は小文字でなければなりませんa
  • たとえば、^[0-9]最初の文字は数字である必要があります。

$一致は文字列の末尾で発生する必要があります

  • 例: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"一致しません" を返します。これは、数字が文字列の先頭になかったためです。

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 : 異なるパターンを分割する

この例では、範囲 ( A1A2& 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

おすすめ記事