皆様こんにちは
様々なプログラムに触れていると『正規表現』という名称を見かけた事があるかもしれませんが
今回は正規表現について学びます。
【正規表現とはなんだろう】
色々な文字を1つの文字列で表現する方法で、英数字は勿論ですが方法によっては漢字と記号も可能です。
実際に簡単な例として下記のようなケースを確認してみます。
abcdefghijklmnopqrstuvwxyz0123456789
上記はただの英数字を並べただけの文字列ですが、正規表現では
これらの36文字をとても簡単に表現することが可能ですのでいくつか例を記します。
例1: ([a-z0-9]{1,40})
例2: \w*
例3: .+
例1はなんとなくわかるかと思いますが例2・3で本当にできるのでしょうか、
実際にこれら3例が本当に表現可能かどうか試してみましょう。
https://weblabo.oscasierra.net/tools/regex/
※こちらのサイトでは正規表現した内容が合致している場合、対象の文字が赤色になります。
https://www-creators.com/tool/regex-checker
※こちらのサイトでは正規表現した内容が合致している場合、対象の文字が実行結果に表示されます。
正しく表現できてましたでしょうか。
正規表現の方法は多種多様で、どれが正解かというのはありません。
しかし使い方を間違えてしまうと思わぬ文字列が合致してしまい、意図した事と異なる事象が発生する
場合もありますので状況(定義)に応じて最適な表現方法が何かを考える必要があります。
本記事では基礎的な正規表現を学習してみます。
【正規表現はいつもと違う文字を使う(メタ文字)】
状況(定義)によっては馴染みの英数字を使いますが基本的には特殊な文字を使います。
この特殊な文字にはそれぞれに意味がありますのでどれが何なのか基本部分を押さえておきましょう。
『.』 オールマイティな1文字
『^』 文の始まりを示す文字 ※グループ化した場合は指定した文字以外のものを示す事に変わる
『$』 文の終わりを示す文字
『[]』 []内に指定した文字のいずれか1文字を示すためのグループ化表現
『()』 ()内に指定した文字のいずれかを示すためのグループ化表現
『{}』 {}の一つ前の文字(定義済み表現、メタ文字含む)を何文字数示すのかを表す表現 {1,40}の場合は1~40文字を示す
『*』 *の直前に文字が無いか、*の一つ前の文字(定義済み表現、メタ文字含む)を1回以上繰返す事を示す
『+』 +の一つ前の文字(定義済み表現、メタ文字含む)を1回以上繰返す事を示す
『?』 ?の直前に文字が無いか、1回だけ繰り返すという意味
『|』 ()でグループ化した際に or 的な意味を示す。
『\』 キーボードの 右シフトの左隣を半角で打つと出てくる この文字の後はメタ文字ではなくてただの文字ですと宣言する
※定義された正規表現をする場合にも使いますが今回は割愛します。
基本的なメタ文字は以上となります。
もちろん通常に使う英数字や一部アンダーバー(_)やハイフン(-)などの文字も
正規表現では活用していきます。
【正規表現を使ってみよう】
例題に沿って複数の文字列や文章を正規表現でかいてみましょう。
■CASE1
私は~です。 の~の部分を正規表現を使って以下の4つが全て合致するよう書いてみましょう。
私はaです。
私は9です。
私は仁です。
私は-です。
複数のパターンが存在、英数字と漢字と記号が含まれていますが簡単に表現することが可能です。
◆表現例
私は.です。
.というのは正規表現では万能な文字として表現されます。
.には半角の英数字(大文字小文字)、半角の記号、全角の英数字漢字ひらがな等
全ての文字であると宣言する表現になります。
■CASE2
hogeさんの家には5人の子供がいますが5人の姓名を正規表現で書いてみましょう
hoge tarou
hoge hutaba
hoge michiko
hoge shirou
hogeikumi
基本的には姓と名の間に半角スペースが入ってますがデータを確認したところ
1名だけ半角スペースが入っていませんでしたが以下のように表現することが可能です。
hoge\s?(tarou|hutaba|michiko|shirou|ikumi)
hoge ?(tarou|hutaba|michiko|shirou|ikumi)
■CASE3
URLの一部を正規表現で指定してみましょう。
今回はURLのパラメーター以下の部分のみ指定しますが
合致するのは〇に指定したもののみになります。
https://www.hoge.com/?abcd
https://www.hoge.com/?efgh
https://www.hoge.com/?ijklmn
CASE1の時のようにパターンが少ない場合なら()でグループ化してもよいですが
これが100通りあると100通り書かなくてはならないのでさすがに不便です。
従って以下のように表現してみましょう。
◆表現例
\?[^a-d]+$
ぱっと見てみるとよくわかりませんのでひとつずつ分解してみましょう。
\? [^a-d] + $
こうするとわかりやすいですね
\?は ?というメタ文字ではなくて?というただの文字を表現しています。
今回のポイントは [^a-d]+ と $の部分になります。
・[^a-d] について
これはアルファベットのaからd以外の文字を示す表現になっています。
[a-d]にするとアルファベットのaからdのみ となります。
・+ について
aからd以外の文字の1回以上繰返すという意味になります。
+が無いと1文字しか指定することができません。
最後の$は行の終わりを示してます。
■CASE4
以下のような郵便番号を正規表現で纏めて表現してみましょう
904-0034
100-1701
673-0882
郵便番号も沢山のパターンが存在していますが今回はこの3つパターン全てとします。
定義によって正規表現の書き方が変わってくるというのをとどめておいてください。
◆表現例
^[0-9]{3}-[0-9]{4}$
^\d{3}-\d{4}$
上と下で組合せを確認するために分解しましょう。
^ [0-9]{3} – [0-9]{4} $
^ \d{3} – \d{4} $
[0-9]{3} について
これは0から9までのいずれかが3文字続くことを示しています。
同じように[0-9]{4}は0から9までのいずれかが4文字続くことを示しています。
しかしもうひとつ別の表現では \d{3} としています。
\d だとただのdという英字であると思いがちですが正規表現では
予め定義された表現というのが存在していて、\d でセットになってます。
いかがでしたでしょうか。
正規表現を使いこなすことで様々なパターンと定義に対して1文で表現することが
可能になります。
GoogleAnalytics、GoogleOptimize以外にも様々なプログラム言語で
活用される事が多いため、まずは基礎の部分についてしっかりマスターしていきましょう。
コメントを残す