Aikの技術日記

技術的な進捗とか成果とかを細々と投稿するブログです。時々雑記も。

正規表現記法についてまとめてみた その1

その2(正規表現特殊文字について)はこちら
その3(JavaScriptでの正規表現使用法 その1)はこちら
その4(JavaScriptでの正規表現使用法 その2)はこちら

はじめに

PC上で文字を扱うなら知っておきたい、痒いところに手が届きすぎる記法「正規表現」。
これを使えば、たった数文字で様々な文字列を表現することができます。
また、あくまで記法の1つなので、特定の言語や環境によらず、わりと色んなところで使えることも魅力ですね。

こんな便利で素敵な正規表現ですが、筆者はこれまで正規表現の素晴らしさに気づくことができず…。
つい先日、やっと正規表現の素晴らしさに気づけたので、この熱が収まらないうちに正規表現についてまとめていこうと思います!

早速正規表現の記法から見てみましょう…と、その前にそもそも正規表現とは何かを少しだけ見ていこうかと思います。

正規表現とは

先の章でも少し話しましたが、正規表現を簡単に説明すると、「少ない文字数で様々な文字列が表現できる記法」の事です。
具体的には、下記の様な感じで文字列を表現できます。

// 表したい文字
「dragon」と「dungeon」

// 正規表現を使うと…
「d(rag|unge)on」

詳しい解説は、Wikipediaさん等になかなかボリューミーに書かれていますので、合わせてどうぞ。

※とはいえ何にもないのも(主に自分が見返す時に)困りますので、こちらにWikipediaさんの前文を引用という形で残しておきたいと思います。
長いので折り畳んでおきました。

展開する

正規表現(せいきひょうげん、英: regular expression)とは、文字列の集合を一つの文字列で表現する方法の一つである。
正則表現(せいそくひょうげん)とも呼ばれ、形式言語理論の分野では比較的こちらの訳語の方が使われる。
まれに正規式と呼ばれることもある。

もともと正規表現形式言語理論において正規言語を表すための手段として導入された。
形式言語理論では、形式言語が正規言語であることと正規表現によって表せることは同値である。
その後正規表現テキストエディタワードプロセッサなどのアプリケーションで(ないし、そもそもそれ以前に単機能の文字列探索ツールの)、マッチさせるべき対象を表すために使用されるようになり、表せるパターンの種類を増やすために本来の正規表現にはないさまざまな記法が新たに付け加えられた。
このような拡張された正規表現には正規言語ではない文字列も表せるものも多く、ゆえに正規表現という名前は実態に即していない面もあるが、伝統的に正規表現と呼ばれ続けている。

この記事では主にこのような正規表現を用いたパターンマッチングについて説明している。
以下、誤解のない限り、アプリケーションやプログラミングにおいて正規表現を用いた文字列のパターンマッチングを行う機能のことを、単に正規表現という。

ほとんどのプログラミング言語では、ライブラリによって正規表現を使うことができる他、一部の言語では正規表現リテラルもある。
正規表現によるマッチ」を意味する(専用の)演算子がある言語なども一部ある。
具体例として、grepAWKsedPerl、Tcl、lexなどがある。
それぞれの言語やアプリケーションで細部の仕様が異なっている、といったように思われることも多いが(また、古い実装では実際にそういうことも多いが)、近年は同じライブラリを使っていれば同じということも多い。またPOSIXなど標準もある。

参考記事(Wikipedia)

((この引用句を見ると、正規表現はあくまで「複数の文字列を少なくまとめることができる記述方法」の1つとのことですが…。
引用文中にもある「アプリケーションやプログラミングにおいて正規表現を用いた文字列のパターンマッチングを行う機能のこと」と言った方が、プログラマーの方々には馴染み深いかもですね。

※投稿日同日追記:
正規表現にはどうやら3種類あるらしく…こんな感じに。

なんだか本当に沼ふっかそうですよねこの分野…。
この3つに関しては、上記に挙げた参考記事に詳しい差異等が載ってましたので参考に…。

それでは次に、正規表現の実際の使い方に関して見ていきましょう。

正規表現の使い方

正規表現は様々な場所で使えます。
ある程度高機能なエディタの検索機能として備わっている場合もありますし、プログラミング言語内で正規表現を扱える場合もあります。

また、正規表現には「特殊文字」というものが存在します。
(これこそが正規表現をバケモノ級に使いやすくしているものですが…。)

これを使うと様々な表現を、たった1行数文字で表現できちゃうのです。

次の章でその特殊文字を1つ1つ見ていきます…と言いたいところですが、これが割とボリュームあるので…。
別記事にまとめたいなと思います。悪しからず…。

次回記事では

次回記事では、先にも申した通り「正規表現特殊文字」について見ていこうと思います。
ではでは|д゚)

余談-正規表現に関する注意事項

最後に余談を…。

正規表現は「最長マッチ」を基本としています。
最長マッチがどんなものかは…説明するより例を見てもらうのが早そうですので、ちょっと例を書いてみました。

下記の様な正規表現パターンとInputである場合のOutputを書きましたので参考に。

正規表現パターン: 「ab*」

"abc" -> ab: 先頭のabがマッチ
"ccccabbbcccc" -> abbb: 中間のaに続く3つのbにマッチ

正規表現を扱える環境(エディタやらプログラミング言語やら)の中には、設定によって最長マッチから最短マッチ等へ変更ができる場合もあります。
最長マッチに困った場合は、各環境のヘルプなりドキュメントなりを見てみるといいかもしれませんね( ゚д゚)