C++0xには、正規表現ライブラリが入る。正規表現がいかに便利であるかは、いまさらここで言うまでもないだろう。問題は、正規表現の文法を解説すべきかということだ。
実際、紙面の都合上、ライブラリをすべて解説できるかどうかはわからない。コア言語と、言語サポート・ライブラリだけで、かなりページを消費すると思う。出版社側は、どうも一冊にこだわっているらしく、その場合、ライブラリは広く浅くといった紹介にならざるを得ない。
もし仮に、ページ数を考えずに、深く解説できたとしても、果たして正規表現の文法自体を解説すべきだろうか。
私は、正規表現を語れるほどには、詳しくない。もちろん便利なので、たまに自分でも正規表現を書くが、文法を覚えていないので、文法書を見ながら書く。
私は、一応、規格書を読むだけの読解力には恵まれているので、正規表現の文法一覧のようなものを書くことはできるだろうと思う。しかし、そんな本は、すでに山ほど出ているのである。しかも、どの本も、私より正規表現を理解している者の手によって書かれているのである。
さらに、C++の規格では、正規表現を定義していない。どのように定義しているのかというと、別の規格を参照している。
さらに、C++で使える正規表現は、一種類ではない。たくさん種類がある。std::regex_constants::syntax_option_type定数で、正規表現の文法を切り替えることができる。case sensitivityとか、最適化などの細かいオプションを除けば、以下のような方言が使える。
- ECMAScript
- ECMA-262で規定されている正規表現、ただし一部変更あり
- basic
- POSIXで規定されている、basic 正規表現。
- extended
- POSIXで規定されている、extended 正規表現。
- awk
- POSIXのユーティリティである、awkの正規表現。
- grep
- POSIXのユーティリティである、grepの正規表現。
- egrep
- POSIXのユーティリティである、grepに-Eオプションを渡した場合の正規表現。
現時点では、私はどれがどれぐらい違うのかということを論ずるだけの知識を持っていない。これだけ種類があって、選べるということが、正規表現オタクを喜ばせるのか、あるいは、これでもまだ少ないと不満がらせるのか、それすら分からない。
ECMA-262に対する変更は、本当に細かい。どうも読んだ限りでは、POSIXのClassAtomExClass, ClassAtomCollatingElement and ClassAtomEquivalenceに相当する機能を付け加えるような文面になっている。
それより気になるのは、文面では、ECMA-262とだけ言っている事だ。何番目の規格とは、明示していない。正規表現が正式に入ったのは3rdだというので、少なくとも、それ以降である。規格書を読むと、3rdと5thでは、微妙に文法定義の方法が違っているのだが、表面的には変わらないのだろうか。単にECMA-262と言っているということは、将来、規格改訂で、文法が変わった場合、それに追随するということだろうか。
とにかく、C++独自の正規表現を定義しているのではなくて、いずれも、すでに十分実績のある、他の規格を参照するようになっている。これらの正規表現自体を学ぶのであれば、すでに本が、洋書和書を問わず、山ほど出ているので、わざわざ解説するまでもないだろう。
これはhitoさんも結論を出されているようですが、他の規格を参照しているときは、参考程度に触れるぐらいでいいのではないでしょうか。
ReplyDelete