ときどき、「これだけ言語によって表現がバラバラなのに『正規』表現なんていうのもおかしな話だ」という声も見受けられますが、正規表現の「正規」の意味合いはそういうことではありません。
regularの意味
「正規表現」は、英語のregular expressionの訳語ですが、regularを英和辞典で引くといろんな意味が出てきます。regular expressionのregularはこのうちだと、「系統[組織]立った」あるいは「(法律・慣例・標準などに合った)正規の」に近い意味合いです。
どういうことかといいますと、文法構造の分類としてregular grammer(正規文法)という文法があって、それと等価になる表現が正規表現、だということです。この「正規文法」は多くのプログラミング言語が則っている「文脈自由文法」より表現範囲が狭い文法で、有限オートマトンで処理できる、という特徴を持ちます。
なお、この意味でのregularは「正則」とも訳されます。とりわけ、エディタなどでの「正規表現」が本来の「正規文法」からはみ出しているという現実があるので、以下では便宜上、「正規表現」は文字列の検索・置換に使うものを指すことにして、数学的に厳密なものについては「正則表現」と表します。
正則表現の構成
正則文法がどのような構成か説明するのは、形式言語理論に慣れていないと難しいので、それと等価で、しかも検索用の正規表現とも近い正則表現の方について、どのような構成かを説明します(表記も、正規表現のものを援用しています)。
- φ(空集合)、文字集合に含まれる各文字は正則表現になる。
- AとBが正則表現なら、A|B(AまたはB)、AB(AとBが連続したもの)は正則表現である。
- Aが正則表現なら、A*(Aを0回以上繰り返したもの)も正則表現である。
- 以上のルールで生成できるものだけが正則表現である。
たったこれだけです。とはいえ、正規表現の大半の機能がこれだけで表現できるのも間違いないところです。例えば、[a-z]
などの文字クラスは全部の文字を|
区切りで並べたものと意味的には等価ですし、?
や+
、{n,m}
といった数の指定も、*
と|
を組み合わせれば実現可能です。
正則表現の範囲を超えた正規表現
ただ、言語によっては正則表現の範囲を超える機能が「正規表現」に組み込まれていることもあります。よくある例としてはキャプチャしたパターンを、同じ正規表現の後のほうで使うというものがあって、これは正則文法で表現できないパターンを生成できます。