正規表現とは?
正規表現は文字列から「どういう条件の文字列を検索するか」という検索ルールの書き方のことを指します。
例えば、数字が連続している部分を検索したい場合、正規表現で書くと「\d+」と3文字で書けます。「\d」の2文字が数字1文字を意味し、「+」が左の「\d」の文字を繰り返していることを意味します。
普通の検索の場合は「12345」という文字列で検索すると「12345」しか抽出できませんが、正規表現の場合はルールに一致する文字列を検索します。そのため、「\d+」という「数字が連続している文字列」というルールには「12345」だけでなく「000000000」や「1」などもルールに当てはまります。
他には、文章の末尾に句読点が付いていない行を検索したり、数字が全角になっている箇所を検索するなど、「検索したい文字」ではなく「検索したいルール」を正規表現で表すことができます。
最初は暗号のようでとっつきにくく感じますが、今まで見たことがない書き方なのでそう見えるだけで、知識として必要なことは多くありません。
VBAでもRegExpオブジェクトを使うことで正規表現を扱うことが出来ます。詳細は「VBAで正規表現(RegExp)を利用する」をご参照ください。
正規表現は難しい? プログラミングより簡単です
初めて正規表現を扱うときは、ルールがかなり独特なため「ルールが分かりにくくて理解できると思えない・・・」と誰でもなりますが、VBAなどのプログラミング言語を覚えるよりもよっぽど簡単です。
プログラミング言語は何百ページもの本を何冊も読むような分量が必要ですが、正規表現はこのページぐらいの内容でも十分に利用できます。さらに言えば、正規表現はプログラミング言語を知らなくても理解できます。
普段使いの正規表現のルールは多くても3つか4つ程度です。正規表現はただの検索条件の書き方に過ぎませんので、最初に1つルールを書いてみればすぐにどういうものか理解できます。
やってみる
まずは実際にやってみましょう。
Windows標準では正規表現を使えるツールとして「PowerShell ISE」がありますので、これでやってみましょう。サクラエディタなどのテキストエディタをインストールしていればそれを使っても構いません。
- Windows標準で「PowerShell ISE」を起動します。(Windows10:スタート→「Windows PowerShell」→「Windows PowerShell ISE」)
- 「PowerShell ISE」が起動したら、左上の「スクリプトを新規作成」ボタンを押します。「無題1.ps1」という白紙ページが表示されます。
- 以下のように5行書きます。数字だけの行や英字だけの行などです。何行でも構いません。
12345
—–
aaaa
0
111111111 - Ctrl+Fキーまたは「編集」メニュー→「スクリプト内を検索」を選択して、検索ダイアログを表示し、検索データに「\d+」と書いて、正規表現のチェックボックスにチェックを付けます。
- あとは「次を検索」ボタンを押していくと、連続する数字部分が次々に検索に引っかかります。カーソルが最下段にある場合は「上へ検索」にチェックを付けると、先頭行に向かって検索します。1行目(12345)と4行目(0)と5行目(111111111)が検索に一致するはずです。
これが、「連続する数字」を正規表現で検索する方法です。一般的なテキストエディタも同様です。
このように、「正規表現」にチェックを付けて、正規表現のルールでの検索文字列を書いて検索することで、「正規表現での文字列検索」を行います。
VBAでも正規表現は扱える
VBAでもRegExpオブジェクトで正規表現を利用できます。
RegExpオブジェクトはCreateObject関数か参照設定で「Microsoft VBScript Regular Expressions 5.5」にチェックを付けると使えるようになります。
詳細は「VBAで正規表現(RegExp)を利用する」をご参照ください。
VBAで使える正規表現パターン
「正規表現」という言葉自体も独特ですが、正規表現には他にもいくつかの独自用語があります。
正規表現で扱う記号文字のことをメタ文字やメタキャラクタと言います。
基本のメタ文字
メタ文字 | 説明 |
---|---|
. | ピリオドで任意の1文字を意味します。「a」も「あ」も漢字1文字もスペース1文字も対象になります。 |
* | 直前の文字を0回以上繰り返すことを表します。「abc*」であれば、「ab」(cが0回)と「abc」(cが1回)と「abccccc」(cが連続)のいずれも対象になります。 |
+ | 直前の文字を1回以上繰り返すことを表します。「abc*」であれば、「abc」(cが1回)と「abccccc」(cが連続)のいずれも対象になります。 |
^ | 2つの使い方があります。単に「^」を書いている場合は行の先頭(左端)を表します。「^A」は先頭がAの文字が対象になります。
メタ文字[]の中にある場合は[]の中にある文字以外の文字を意味します(後述)。 |
$ | 行の終端(右端)を表します。「。$」であれば、「。」で終わっている箇所が対象になります。 |
? | 直前の文字が0文字または1文字あることを表します。「abc*」であれば、「ab」(cが0文字)と「abc」(cが1文字)が対象になります。 |
{a} | 直前の文字をa回繰り返すことを表します。「ABC{3}」は「ABCCC」を意味します。 |
{a,} | 直前の文字をa回以上繰り返すことを表します。「ABC{3,}」は「ABCCC」(cが3回)や「ABCCCCCCC」(cが3回以上)を意味します。 |
{s,e} | 直前の文字をa回以上、b回以下繰り返すことを表します。「ABC{1,3}」は「ABC」(Cが1回)、「ABCC」(Cが2回)、「ABCCC」(Cが3回)が対象になります。 |
[] | []の中にある文字のいずれか1文字が対象になります。「[ABC]」は「A」「B」「C」のいずれも対象になります。 |
[^a] | []の中の^は否定を意味します。「[^ab]」であれば「aとbのどちらでもない文字」を意味します。^で否定の扱いになるのは[]の中の文字全てです。「^」だけの場合は行の先頭の意味ですが、「[^]」の場合は全く意味が違います。 |
| | |の左右のどちらかの文字列が対象になります。「abc|123」であれば「abc」と「123」が対象になります。スペースも1文字と扱われます。スペースを含んだ「[abc | 123 ]」の場合はスペースを含んだ「abc 」「 123 」が対象になります。 |
\ | メタ文字を通常の文字として扱う場合に使います。「.」は任意の1文字を意味しますが、「.」自体の文字を表現したい場合は「\.」と書きます。 |
文字範囲
メタ文字 | 説明 |
---|---|
[a-z] | 小文字の英字のいずれか1文字が対象になります。ハイフン「-」を使う場合は文字コードの小さい方を左側、大きい方を右側に書きます。16進数で扱うabcdefであれば「[a-f]」と書くことで表現できます。 |
[A-Z] | 大文字の英字のいずれか1文字が対象になります。ハイフンの考え方は[a-z]の場合と同様です。 |
[0-9] | 数字のいずれか1文字が対象になります。ハイフンの考え方は[a-z]の場合と同様です。 |
文字の種類
メタ文字 | 説明 |
---|---|
\d | 数字1文字を意味します。「[0-9」と同じ意味です。 |
\t | タブ1文字を意味します。 |
\n | 改行コードのLF(ラインフィード、改行)を意味します。 |
\r | 改行コードのCR(キャリッジリターン、復帰)を意味します。 |
\b | 単語の区切り位置を明示します。「区切り位置」とは、スペース、句読点、括弧などの概念的に文章の区切りと判別できる箇所を指します。「abc\b」であれば「abc」が対象となります。「abcc」は対象になりません。 |
置換
メタ文字 | 説明 |
---|---|
() | 正規表現の対象となった文字列を置換したい場合に、置換範囲として指定するときに使います。()に一致した文字列は()の数だけ「$1」、「$2」・・・と書くことで参照します。「aaaabbb」のaとbを入れ替えたい場合は検索条件に「(a+)(b+)」と設定し、置換後文字列に「$2$1」と書くと、「bbbaaa」になります。$1が「aaa」、$2が「bbb」を参照しているので、「$2$1」と書くことで入れ替える意味になります。 |
VBAで使える正規表現の例
例のカギ括弧「」は見やすさのために書いているだけのため、実際に使うときは「」は外してください。
ただ、半角の [] の括弧は必要です。
検索する文字列 | 正規表現の書き方 |
---|---|
ひらがな1文字 | [ぁ-ん] |
カタカナ1文字 | [ァ-ヴー]
一ヵ所、一ヶ所、のような漢字に含まれるヵヶをカタカナとして検索対象にしたい場合は[ァ-ヶー]とします。 |
半角カタカナ1文字 | [。-゚]
句読点を検索対象にしない場合は[ヲ-゚]とします。 |
半角スペース | 「 」 |
全角スペース | 「 」 |
空行 | 「^\n」、または、「^\r\n」
改行コードの種類によって異なります。 |
行全体 | 「^.*$」 |
ダブルクォーテーションで囲まれた文字列 | 「”.*?”」 |
タグ文字 | 「<.*?>」 |
指定文字列を含まない行 | 「^((?!abc).)*$」
abcを含まない行の意味になります。 |
連続する数字 | 「\d+」または「[0-9+」 |
英単語 | 「[a-zA-Z]+」 |
大文字で始まる英単語 | 「[A-Z][a-z]+」 「[A-Z]」で大文字1文字を意味し、「[a-z]+」が連続する小文字を意味します。 |
改行コードCRLFをLFに変換 | 検索条件「\r\n」、置換条件「\n」 |