2010-03-27

なぜC++0xの正規表現は、ECMAScript準拠なのか

Boostの正規表現ライブラリで使われている正規表現の文法は、Perl 5を参考としている。一方、C++0xに入る、正規表現の標準ライブラリは、ECMAScript準拠(プラスちいさな拡張機能)である。

オプションで、POSIXのbasic、またはexntended、それに加えて、grepの拡張機能に準拠した文法を使うこともできるが、POSIX規格は、常にLeftmost Longest ruleであり、Non greedy repeatsができないので、grepのようなツールならともかく、プログラミング言語の中で使う正規表現としては、貧弱である。

しかし、TR1は、Boostを参考に作られたはずである。なぜ、違うのか。

Perlの正規表現は、Javascriptプログラマから見ると、少々羨ましい機能がある。特に、independent sub-expressions, zero width look-behind assertions, and interpreted sub-expressionsだ。特に、recursive expressionは、垂涎モノである。

しかし、C++は、Perlのような、具体的な実装ではない。標準規格である。規格である以上、厳密に、正規表現を定義しなければならない。選択肢は、いくつかある。

  1. 正規表現の文法は、実装依存とする。
  2. C++の規格書で、正規表現の文法を、厳密に定義する。
  3. 他の正規表現の規格を、参照する。

1.は、明らかに問題がある。せっかく、正規表現ライブラリがあるというのに、ポータブルに使えないとあっては、だれも使いたがらない。2.は、悪くはない。しかし、正規表現を厳密に定義するのは、かなり時間と労力がかかる。それに、まったく新しい正規表現の文法を定義するというわけでもない。無駄である。

とすると、3.の、他の規格を参照するのが、最も現実的な選択である。では、どの規格を参照するのか。

といっても、実は、しっかりした正規表現の規格というのは、ふたつしかない。POSIXのbasicとextentedか、ECMAScriptである。

Perlはどうなのか。Perlは、厳密な規格というものが、存在しない。それに、Perlの正規表現は、言語機能として組み込まれていることを前提としている。ライブラリベースの実装である、C++には、不向きである。それに、Perl6では、正規表現がガラリと変わる。

そういうわけで、C++0xには、ECMAScript準拠の正規表現が、採用された。

n1429: A Proposal to add Regular Expressions to the Standard Library

No comments: