正規表現を使ってみよう!リテラルとメタ文字、パターンの基本のキ
正規表現とは、ある規則性を持った文字の並びを表現する表記法です。UNIXのコマンドやPerl、PHP、JavaScriptなどで広く使われているので、目にする機会は多いはず。規則を「パターン」として記述することで、条件に合った複数の文字列を、シンプルに表現して取り扱えます。正規表現を使えば、例えば、任意の文字列が条件に該当しているかをシンプルに表現できるので、簡単に文字列の検索や置換ができます。まずは簡単な基本をチェックしましょう。
正規表現を構成する「リテラル」と「メタ文字」、「パターン」
正規表現では、「リテラル」と呼ばれる通常の文字と、. ^ * [ $ など「メタ文字」と呼ばれる記号を使います。リテラル(literal 文字通りの)とは、見た通りの意味を持った文字です。一方、メタ文字は、特殊な機能を果たす記号です。これらを組み合わせながら、基本的なパターンに沿って記述して使います。
リテラル:a~zや0~9、ひらがな、カタカナ、漢字 など
メタ文字:. ^ * [ $ など
また、「パターン」とは、その文字列における特定の条件や規則性です。例えば、次のようなルールに沿った文字列がある場合、それに該当する・しない文字列がそれぞれ規定されます。このルールが複雑になればなるほど、見た通りの意味を持つリテラルだけでは、さまざまな条件を記述できなくなります。そのため、文字列の条件や規則性を記述することで、汎用性のあるシンプルな表現が可能です。
例)
・ルール:「水」で始まる
・該当する文字列
水蒸気 水墨画と掛け軸 (非該当:用水路)
・ルール:「水」を含む
・該当する文字列
蒸留水 月曜日から水曜日まで (非該当:みず water)
例えば、上記の例は、正規表現を使うと次のように表せます。
・「水」で始まる文字列
^水.*$
・「水」を含む文字列
^(?=.*水).*$
○正規表現の例
メタ文字 | 意味 |
---|---|
^ | 行頭、文頭 |
$ | 行末、文末 |
. | 任意の1文字(改行を除く) |
* | 直前の文字の0回以上の繰り返し |
+ | 直前の文字の1回以上の繰り返し |
? | 直前の文字は省略可能 |
[xyz] | [ ] 内の文字のうち、いずれかの一文字(例:xかyかz) |
[0-9] | 連続する文字コードのうち、いずれかの一文字(例:0から9までのどれか) |
a|b | | の左右の文字列のいずれか(例:aかbどちらか) |
{n} | 直前の文字のn回の繰り返し |
? | 直前の文字の0回か1回の出現 |
{min,max} | 直前の文字の、min以上max以下の繰り返し(min、maxは省略可能) |
主な正規表現の例
もう少し具体的に、正規表現の例を見てみましょう。
○ .(ドット):任意の一文字
全角や半角に関係なく、任意の一文字を表します。スペースや記号も対象ですが、改行は対象外です。
例)
..水を飲みたい。
・該当する文字列
炭酸水を飲みたい。
その水を飲みたい。
「.」が2つなので、「水」の前に2文字ある文字列が該当します。ただし、このパターンでは2文字の場合しか該当せず、それ以外も探したい時にヒットしません。このような場合には、パターンの繰り返しを表現するメタ文字があります。
○ +(プラス):直前の文字の1回以上の繰り返し
直前のパターンの、1回以上の繰り返しを表します。このような、回数の繰り返しを指定するメタ文字は「量指定子」と呼ばれます。
例)
.+水を飲みたい。
・該当する文字列
麦が発酵した水を飲みたい。
身体を冷やしすぎないように、常温の水を飲みたい。
○ *(アスタリスク):直前の文字の0回以上の繰り返し
前述の「+」と違い、指定する文字が表れない場合も含みます。
例)
水をたっ*ぷり飲みたい。
・該当する文字列
水をたっぷり飲みたい。
水をたっっっぷり飲みたい。
<PR>面倒なことを回避できるなら、一時的な面倒は苦にならない!正規表現も覚えてしまえば楽ですよね。システム運用も、SaaS型の運用管理サービス「UOM」でシンプルで楽にしましょう!詳しくはこちらへ
○ ( )(丸括弧):グループ化と、 | (垂直線):グループ化した中のいずれかの文字列
複数の文字列をグループ化できます。また、グループの中の任意の文字列を表します。
例)
(水|味噌汁|ビール|Dr Pepper)を飲みたい。
・該当する文字列
ビールを飲みたい。
Dr Pepperを飲みたい。
○ [ ] (角括弧・ブラケット):指定した文字のうちいずれか1文字
[ ] (角括弧)で囲んだ中に入れられた文字は、何でも該当します。角括弧内の任意の1文字を表現し、「文字クラス」と呼ばれます。またハイフン – を挟むと、文字コード上で連続する文字列を指定することができます。下記の例では、全角/半角に関係なく、数字をすべて指定しています。
例)
一本目の炭酸水は[0-90-9]+円!
・該当する文字列
一本目の炭酸水は100円!
一本目の炭酸水は99円!
○ { , } (中括弧・ブレイス)最少または最大繰り返しの回数の指定
{ , } (中括弧)では、繰り返し回数の上限・下限を指定できます(どちらか一方でも可)。
例)
冷えたビールあります!{1,7}
・該当する文字列
冷えたビールあります!
冷えたビールあります!!!!!!!
使える場所や、チートシートも豊富!
正規表現は、さまざまな場所で使えます。例えば、Google ドキュメントの「検索と置換」では、正規表現が使えます。また、エディタの多くも、正規表現を利用した複数ファイルの一括検索や置換ができる機能を持っています。まずは、自分が普段使っているエディタの機能をチェックするのもオススメ。
また、正規表現は、表現の正誤チェッカーや、郵便番号や電話番号などのサンプル集、よく使う表現を集めたチートシートなどが豊富にあり、ライブラリのようにコピー&ペーストしてそのまま使えます。先に紹介した、Markdown記法と共に、使いこなせるようになれば、定型業務もすごく楽に。すべてを一度に覚える必要はないので、これらを参考にしながら少しずつ慣れるのがいいでしょう。
例)
郵便番号
[0-9]{3}-[0-9]{4}
\d{3}-\d{4}
電話番号
0[589]0-?[0-9]{4}
0[589]0-?\d{4}-?\d{4}
正規表現チェッカー PHP: preg_match() / JavaScript: match()
http://okumocchi.jp/php/re.php
正規表現チェッカー javascript aid
http://js.wakastream.jp/regex.html
Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.
https://www.debuggex.com/
<PR>正規表現がエンジニアに不可欠なように、システム運用を統合型のサービスで効率化するのも必須。「UOM」なら、フィルタ処理や電話通知、オペレーションなども自動化できます!詳しくはこちらへ