Excel で正規表現を使用し、データ操作に Excel の強力なグリッドのような設定を活用するにはどうすればよいでしょうか?
- 文字列内の一致したパターンまたは置換された値を返すセル内関数。
- データの列をループし、隣接するセルとの一致を抽出する Sub。
- どのような設定が必要ですか?
- Excel の正規表現の特殊文字は何ですか?
正規表現は多くの状況では理想的ではないことは理解しています(正規表現を使用するか、使用しないか?) Excel では、同様の操作に、、、 タイプのコマンドLeft
を使用できるためです。Mid
Right
Instr
ベストアンサー1
正規表現パターンマッチングに使用されます。
Excel で使用するには、次の手順に従ってください。
ステップ 1 : 「Microsoft VBScript Regular Expressions 5.5」への VBA 参照を追加します。
- 「開発者」タブを選択します(このタブがありません。どうすればいいですか?)
- 「コード」リボンセクションから「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]
アルファベットの小文字の 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]
最初の文字は数字である必要があります。
$
一致は文字列の末尾で発生する必要があります
- 例:
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