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のような、具体的な実装ではない。標準規格である。規格である以上、厳密に、正規表現を定義しなければならない。選択肢は、いくつかある。
- 正規表現の文法は、実装依存とする。
- C++の規格書で、正規表現の文法を、厳密に定義する。
- 他の正規表現の規格を、参照する。
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:
Post a Comment