目次
もし誰かが正規表現でExcelのツールボックスを充実させることができたら、どんなに強力だろうと考えたことがありますか? 私たちは考えただけでなく、それに取り組んできました :) そして今、この素晴らしいRegEx関数を自分のワークブックに追加して、パターンに一致する部分文字列をすぐに消去することができます!
先週は、Excelで正規表現を使って文字列を置換する方法を紹介しました。 そのために、カスタムRegex置換関数を作成しました。 その結果、この関数は本来の用途を越えて、文字列の置換だけでなく、削除もできることがわかりました。 なぜでしょうか。 Excelで言えば、値の削除とは、空文字列に置き換える以外の何でもありませんが、このRegex関数では、そのようにします。お手の物
VBA RegExp関数でExcelの部分文字列を削除する
ご存知のように、Excelでは正規表現はデフォルトではサポートされていません。 正規表現を有効にするには、独自のユーザー定義関数を作成する必要があります。 良いニュースは、そのような関数がすでに書かれており、テスト済みで、すぐに使えることです。 あなたがすべきことは、このコードをコピーして、VBAエディタでペーストし、そのファイルを マクロ可能なワークブック (.xlsm)です。
この関数は次のような構文になっています。
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])最初の3つの引数は必須で、最後の2つはオプションである。
どこで
- テキスト - 検索するテキスト文字列。
- パターン - 検索するための正規表現を指定します。
- 交換 - に置き換えるテキストです。 部分文字列の削除 パターンにマッチする場合は 空の文字列 ("") を使って交換します。
- インスタンス番号 (オプション) - 置換するインスタンス。 省略すると、見つかったすべてのマッチが置換されます (デフォルト)。
- マッチケース (オプション) - テキストの大文字小文字を区別するかどうかを示すブール値。 大文字小文字を区別する場合は TRUE (デフォルト)、区別しない場合は FALSE を使用します。
詳しくは、RegExpReplace関数をご覧ください。
ヒント:簡単なケースでは、Excelの数式でセルから特定の文字や単語を削除することができます。 しかし、正規表現は、このためのより多くの選択肢を提供します。
正規表現による文字列の削除方法 - 例
前述したように、パターンにマッチするテキストの部分を削除するには、空文字列に置き換えることになる。 そこで、一般的な数式は次のような形になる。
RegExpReplace(text, pattern, "", [instance_num], [match_case])以下に、この基本コンセプトの様々な実装例を示す。
すべてのマッチまたは特定のマッチを削除する
RegExpReplace 関数は、与えられた正規表現にマッチするすべての部分文字列を見つけるように設計されています。 どの出現を削除するかは、オプションの 4 番目の引数で制御します。 インスタンス番号 .
デフォルトは "all matches "です。 インスタンス番号 引数を省略した場合、見つかったマッチはすべて削除されます。 特定のマッチを削除するには、インスタンス番号を定義します。
以下の文字列のうち、1番目の注文番号を削除したいとする。 このような番号はすべてハッシュ記号(#)で始まり、ちょうど5桁の数字を含む。 そこで、この正規表現を使用して識別することができる。
パターン : #d{5}b
単語境界は、一致する部分文字列が#10000001のような大きな文字列の一部であってはならないことを指定します。
すべてのマッチを削除するには インスタンス番号 引数は定義されていない。
=RegExpReplace(A5, "#3d{5}3b", "")
初回発生分のみを根絶するために インスタンス番号 引数を 1 にする。
=RegExpReplace(A5, "#3d{5}3b", "", 1)
特定の文字を削除する正規表現
文字列から特定の文字を取り除くには、不要な文字をすべて書き出し、縦棒で区切ればよい。
たとえば、さまざまな形式で書かれた電話番号を統一するために、まず括弧、ハイフン、ドット、空白などの特定の文字を排除する。
パターン : \(
=RegExpReplace(A5, "╱╱╱)
この演算の結果は、"1234567890 "のような10桁の数字になります。
便宜上、正規表現を別のセルに入力し、$A$2のような絶対参照を使ってそのセルを参照することができます。
=RegExpReplace(A5, $A$2, "")
そして、連結演算子(&)やRIGHT、MID、LEFTなどのText関数を使って、思い通りの書式を標準化することができるのです。
例えば、すべての電話番号を(123)456-7890の形式で書くには、次のような式になります。
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)")
ここで、B5 は RegExpReplace 関数の出力です。
正規表現による特殊文字の除去
Excelで不要な文字を削除する方法について、内蔵関数とカスタム関数を使ったチュートリアルをご紹介しました。 正規表現を使えば、もっと簡単にできます!削除する文字をすべて列挙するのではなく、残したい文字を指定するだけです:)。
をベースにしたパターンです。 ひていもじクラス - は、キャレットを文字クラス[^ ]の中に入れ、括弧内でない任意の1文字にマッチさせます。 数量化子 + は、連続した文字を1つのマッチと見なし、個々の文字ではなく、マッチした部分文字列に対して置換が行われるよう強制します。
ニーズに応じて、以下の正規表現のいずれかを選択してください。
削除するには 非アルファベット 文字、すなわち文字と数字を除くすべての文字です。
パターン : [^0-9a-zA-Z]+.
すべての文字をパージするには 文字以外 , すうじ と 空間 :
パターン : [^0-9a-zA-Z ]+.
すべての文字を削除するには 文字以外 , すうじ と 下線 のように、英数字やアンダースコア以外の文字の頭文字をとって、"W "と表記することも可能です。
パターン : \W+
を希望する場合 よけいなお世話 句読点などの記号は、括弧の中に入れてください。
例えば、文字、数字、ピリオド、カンマ、スペース以外の文字を取り除くには、次の正規表現を使用します。
パターン : [^0-9a-zA-Z., ]+.
これにより、特殊文字をすべて除去することに成功しましたが、余分な空白が残ってしまいます。
これを解決するには、上記の関数を入れ子にして、複数のスペースを1つのスペース文字に置き換える別の関数を作成すればよい。
=RegExpReplace(RegExpReplace(A5,$A$2,""), " +", "")
または、ネイティブのTRIM関数を使用すれば、同じ効果が得られます。
=TRIM(RegExpReplace(A5, $A$2, ""))
非数字を削除する正規表現
文字列から数字以外の文字をすべて削除するには、この長い数式か、以下に示す非常に単純な正規表現のいずれかを使用することができます。
数字以外の文字にマッチします。
パターン : \D+
否定されたクラスを使用して、非数値文字を除去する。
パターン : [^0-9]+
パターン : [^\d]+
ヒント:テキストを削除して残った数字を別々のセルにこぼしたり、指定した区切り文字で区切って1つのセルにまとめたりすることが目的なら、「正規表現を使って文字列から数字を抽出する方法」で説明したようにRegExpExtract関数を使用することができます。
スペースの後をすべて削除する正規表現
スペース以降の文字をすべて消去するには、スペース( )またはホワイトスペース( \s )で最初のスペースを探し、.*でそれ以降の文字にマッチさせます。
通常のスペース(7ビットASCIIでは32)しか含まない1行の文字列であれば、以下の正規表現を使っても問題ありません。 複数行の文字列の場合は、違いが出てきます。
すべて削除するには 空白文字の後 の場合、この正規表現を使用します。
パターン : " .*"
=RegExpReplace(A5, " .*", "")
の最初のスペース以降を削除します。 各行 結果を正しく表示するために、必ず「文字列の折り返し」をオンにしてください。
全てを剥ぎ取るために 空白の後 (スペース、タブ、キャリッジリターン、改行も含む)であれば、正規表現は
パターン : \s.*
=RegExpReplace(A5, "\s.*", "")
を含む数種類の空白文字にマッチするからです。 しんせん (という数式は、セル内に何行あっても、最初のスペース以降をすべて削除します。
特定の文字以降のテキストを削除する正規表現
先ほどの方法を使えば、指定した文字以降のテキストを消去することができます。
各行を個別に処理するため。
一般的なパターン : char.*。
単一行の文字列の場合、これは、以下のものをすべて削除します。 焦がす VBAの正規表現では、ピリオド(.)は改行以外のすべての文字にマッチするため、複数行の文字列では、各行が個別に処理されます。
すべての行を1つの文字列として処理する場合。
一般的なパターン : char(.
改行も含め、指定した文字以降を削除する場合は、パターンに"Ⓐ"を追加します。
例えば、文字列の最初のカンマの後のテキストを削除するには、次の正規表現を試してみてください。
パターン : ,.*
パターン : ,(.
下のスクリーンショットでは、結果がどのように異なるかを確認することができます。
スペースの前をすべて削除する正規表現
長い文字列を扱う場合、すべてのセルの同じ部分を削除して短くしたいことがあります。 以下、そのようなケースを2つ紹介します。
最後のスペースより前のものをすべて削除
前の例と同様に、正規表現は「スペース」の理解に依存します。
までなら何でも合わせること。 下天井 この正規表現は、アスタリスクの後のスペースを目立たせるために、引用符を追加しています。
パターン : ".* "
より前のものにマッチするように 最後の空白 (スペース、タブ、キャリッジリターン、改行を含む)を使用する場合は、この正規表現を使用します。
パターン : .*\s
特に複数行の文字列でその差は顕著です。
最初のスペースより前にあるものをすべて取り除く
文字列の最初の空白までのものにマッチさせるには、この正規表現を使用します。
パターン : ^[^ ]* +
文字列^の先頭から、0個以上の非空白文字[^ ]*と、その直後に1個以上の空白文字 " + "をマッチさせる。 最後の部分は、結果の先頭の空白を防ぐために追加されている。
各行の最初のスペースより前のテキストを削除するために、数式はデフォルトの「全一致」モード( インスタンス番号 省略)。
=RegExpReplace(A5, "^[^ ]* +", "")
1行目の最初のスペースより前のテキストを削除し、他の行はそのまま残すには インスタンス番号 引数は 1 に設定される。
=RegExpReplace(A5, "^[^ ]* +", "", 1)
文字の前をすべて削除する正規表現
特定の文字より前のすべてのテキストを削除する最も簡単な方法は、次のような正規表現を使用することです。
一般的なパターン : ^[^char]*char
人間の言葉に置き換えると、「^で固定された文字列の先頭から、以下の0個以上の文字にマッチすること」となります。 焦がす の最初の出現位置までの[^char]*。 焦がす .
例えば、最初のコロンより前のテキストをすべて削除するには、次の正規表現を使用します。
パターン : ^[^:]*:
この場合、最初のコロンより前は削除され、コロンの直後は空白が切り捨てられます。
パターン : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:\s*", "")
ヒント:正規表現以外にも、Excelには位置や一致によってテキストを削除する独自の手段があります。 ネイティブの数式でタスクを達成する方法については、Excelで文字の前や後のテキストを削除する方法を参照してください。
を除くすべてを削除する正規表現
文字列から残したい文字以外のすべての文字を消すには、否定文字クラスを使用します。
例えば、小文字とドット以外のすべての文字を削除するには、正規表現を使用します。
パターン : [^a-z.]+.
実は、この関数ではマッチした文字列をすべて置き換えるので、 + という量記号はなくてもかまいません。 量記号は、個々の文字を処理するのではなく、部分文字列を置き換えるという意味で、 少しだけ高速に処理します。
=RegExpReplace(A5, "[^a-z.]+", "")
Excelでhtmlタグを削除するための正規表現
まず最初に、HTMLは正規言語ではないので、正規表現を使って解析するのは最善の方法ではないことに注意してください。 とはいえ、正規表現を使えば、セルからタグを取り除き、データセットをよりきれいにすることができることは間違いありません。
htmlタグは常に角括弧内に配置されるため、以下の正規表現のいずれかを使用してタグを検索することができます。
ネガティッドクラス。
パターン : ]*>
ここでは、開き角括弧の後に、閉じ角括弧 [^>]* 以外の任意の文字が0回以上、最も近い閉じ角括弧まで続く場合にマッチします。
レイジーサーチ
パターン :
ここでは、最初の開き括弧から最初の閉じ括弧までのすべての文字にマッチします。 疑問符は、閉じ括弧を見つけるまで、.*にできるだけ少ない文字をマッチさせるようにします。
どのパターンを選んでも、仕上がりはまったく同じになります。
例えば、A5の文字列からhtmlタグをすべて削除してテキストを残すには、次のような式になります。
=RegExpReplace(A5, "]*>", "")
または、スクリーンショットに示すように、遅延量詞を使用することもできます。
この方法は、1つのテキスト(5~9行目)に対しては完璧に機能しますが、複数のテキスト(10~12行目)に対しては、異なるタグのテキストが1つに統合されてしまうという疑問があります。 これは正しいのかどうか? 残念ながら、簡単に決められるものではなく、すべては望ましい結果を理解することによります。 たとえば、B11では「A1」という結果を期待しますが、B10では、「A1」という結果を期待するかも知れません。"data1 "と "data2 "はスペースで区切ること。
htmlタグを削除し、残ったテキストをスペースで区切るには、このようにします。
- タグを空文字列ではなく、空白「"」に置き換える。
=RegExpReplace(A5, "]*>", " ")
- 複数のスペースを1つのスペース文字に縮小する。
=RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", "")
- 先頭と末尾のスペースをトリミングする。
=TRIM(RegExpReplace(A5, "]*>", " "), " +", " "))
このような結果になります。
Ablebits Regex Remove Tool
Ultimate Suite for Excelをお使いの方は、最近のリリースで導入された新しいRegexツールをすでにご存知でしょう。 これらの.NETベースのRegex関数の優れた点は、第一に、VBA RegExpの制限を受けないフル機能の正規表現構文をサポートし、第二に、すべてのコード統合が行われるためワークブックにVBAコードを挿入しなくてもよいということです。バックエンドで
あなたの仕事は、正規表現を組み立てて関数に渡すことです :) 実際の例で、その方法をお見せしましょう。
正規表現で括弧や括弧の中のテキストを削除する方法
長い文字列の中には、重要度の低い情報が[括弧]や(括弧)で囲まれていることがあります。 それらの無関係な情報を、他のすべてのデータを維持したまま取り除くにはどうすればよいでしょうか。
実は、htmlタグ、つまり角括弧内のテキストを削除するための同様の正規表現をすでに構築している。 もちろん、角括弧や丸括弧にも同じ方法が使える。
パターン : (\(.*?\))
そのコツは、遅延量詞(*?)を使って、できるだけ短い部分文字列にマッチさせることです。 最初のグループ( \(.*?\))は、開き括弧から最初の閉じ括弧までマッチします。 次のグループ( \[.*?*]は、開き括弧から最初の閉じ括弧までマッチします。 縦棒は、(1)のようになります。
パターンが決まったら、それをREGEX Remove関数に送り込みましょう。 その方法は以下の通りです。
- について エイブルビットのデータ タブで テキスト グループをクリックします。 Regexツール .
結果を値ではなく、数式として取得するには、以下のように選択します。 数式として挿入する のチェックボックスにチェックを入れます。
A2:A5の文字列から括弧内のテキストを削除するために、以下のように設定する。
その結果 AblebitsRegexRemove 関数は、元のデータの隣にある新しい列に挿入されます。
関数を直接セルに入力することもできます。 インサート機能 の下に分類されるダイアログボックスです。 AblebitsUDFs .
として AblebitsRegexRemove は、テキストを削除するために設計されており、ソース文字列と正規表現の2つの引数のみを必要とします。 両方のパラメータは、数式で直接定義するか、セル参照の形で提供することができます。 必要に応じて、このカスタム関数はネイティブのものと一緒に使用することが可能です。
例えば、出来上がった文字列の余分なスペースを切り取るには、TRIM関数をラッパーとして利用することができます。
=TRIM(AblebitsRegexRemove(A5, $A$2))
以上、エクセルで正規表現を使って文字列を削除する方法でした。 読んでいただきありがとうございました!来週のブログでお会いできるのを楽しみにしています。
ダウンロード可能なもの
正規表現による文字列の削除 - サンプル (.xlsm ファイル)
Ultimate Suite - 体験版 (.exeファイル)