正規表現はパターンマッチングに使用されます。
Excelで使用するには、次の手順に従います。
手順1:VBA参照を「Microsoft VBScript正規表現5.5」に追加する
- [開発者]タブを選択します(このタブがありません。どうすればよいですか?)
- 「コード」リボンセクションから「Visual Basic」アイコンを選択します
- 「Microsoft Visual Basic for Applications」ウィンドウで、トップメニューから「ツール」を選択します。
- 「参照」を選択します
- 「Microsoft VBScript正規表現5.5」の横のボックスをオンにして、ワークブックに含めます。
- 「OK」をクリック
ステップ2:パターンを定義する
基本的な定義:
-
範囲。
- たとえば
a-z
、aからzまでの小文字に一致します
- たとえば
0-5
、0から5までの任意の数値に一致します
[]
これらの括弧内のオブジェクトの1つと正確に一致します。
- たとえば
[a]
、文字aに一致します
- たとえば
[abc]
、a、b、cの1文字に一致します
- たとえば
[a-z]
、アルファベットの単一の小文字に一致します。
()
リターンの目的で異なる一致をグループ化します。以下の例を参照してください。
{}
その前に定義されたパターンの繰り返しコピーの乗数。
- たとえば、
[a]{2}
2つの連続した小文字aに一致します。aa
- 例えば
[a]{1,3}
、少なくとも1と最大3つの小文字に一致しa
、aa
、aaa
+
その前に定義されたパターンの少なくとも1つ以上に一致します。
- 例えば、
a+
一致する連続したAさんa
、aa
、aaa
、など
?
その前に定義されたパターンのゼロまたは1つに一致します。
- たとえば、パターンは存在する場合と存在しない場合がありますが、一致できるのは1回だけです。
- たとえば、
[a-z]?
空の文字列または単一の小文字に一致します。
*
その前に定義されたゼロ個以上のパターンに一致します。-たとえば、存在する場合と存在しない場合があるパターンのワイルドカード。-たとえば、[a-z]*
空の文字列または小文字の文字列に一致します。
.
改行以外の任意の文字に一致します \n
- 例:
a.
aで始まり、次を除くすべてで終わる2文字の文字列に一致します。\n
|
OR演算子
- たとえば
a|b
、どちらかa
またはb
一致することを意味します。
- たとえば
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:異なるパターンを分割する
この例では、範囲(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