[解決済み] Microsoft Excelで正規表現(Regex)をセル内とループの両方で使用する方法
質問
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
関連
-
[解決済み] Regex:最初に出現する文字までのマッチング
-
[解決済み] 正規表現におけるスラッシュのエスケープ
-
[解決済み] Regex Last occurrence?
-
[解決済み] 正規表現で変数を使うには?
-
[解決済み] grepで星座を使う
-
[解決済み] 展開された正規表現では、どのように解釈されますか?
-
[解決済み] 郵便番号の正規表現
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] 正規表現における「lazy」「greedy」の意味とは?
-
[解決済み】正規表現におけるAND/OR演算子はどのように表現されますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 正規表現による逆マッチ[重複]の場合
-
[解決済み] 与えられた文字列が与えられた部分文字列を含んでいるかどうかを見つけるための、scala の慣用的な方法は何ですか?
-
[解決済み] Scalaで正規表現を使ったパターンマッチを行うには?
-
[解決済み] PostgreSQL での isnumeric()
-
[解決済み] 文字列の最後の文字にマッチする正規表現[重複]について
-
[解決済み] Regex - ハイフンはエスケープされるべきか?重複
-
[解決済み] この文字にマッチしない」という意味の正規表現演算子はどれ?
-
[解決済み] RegExp マッチする文字列が my で始まらない
-
[解決済み] この文字にマッチしない」という意味の正規表現演算子はどれ?
-
[解決済み] XHTMLの自己完結型タグを除くオープンタグにマッチするRegEx