|
おはようございます。ユーザの IKKI です。
この件に関連して、ちょっと私見を述べさせていただきます。
元の話題からは多少離れてしまうかもしれませんが、議論の材料になれば幸いです。
●結論
/[aA][bB][cC]/ のようなトリックを学生に教えることは、ほとんど無益です。
●理由1
事実上すべての現代的な処理系は、正規表現で大文字小文字を同一視する方法を提供
しています。
http://www.regular-expressions.info/refflavors.html によれば、JGsoft (誰?), .
NET Framework (C#, VB.NET など), Java, Perl, PCRE (PHP など), ECMA (JavaScri
pt), Python, Ruby, XPath は大文字小文字の同一視が可能です。
一方、POSIX BRE/ERE, GNU BRE/ERE, XML Schema は大文字小文字の同一視が不可能
です。これはバックエンドの正規表現エンジン単体では当該機能を持たないという意
味で、実際にはフロントエンドとなる個々のアプリケーション (例えば GNU grep, g
awk, GNU sed など) が大文字小文字を同一視するオプションを提供している場合が
多いです。
●理由2
/[aA][bB][cC]/ と /abc/i では後者の方が高速です。
秀丸エディタ v8.00β18 + HmJre v2.05 を使っている手元のマシンで、
--------
aAaAaAaAaAaAaAaAaAaAaAaAa
--------
という文書に対し、次の 2 種類のパターンを検索してみました。
// パターン1
searchdown "[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[a
A]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA]?[aA][aA][aA]
[aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA][aA]
[aA][aA][aA]", regular;
// パターン2
searchdown "a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?a?aaaaaaaaaaaaaa
aaaaaaaaaaa", regular, nocasesense;
検索時間は前者が 6.037 秒、後者が 2.465 秒でした。
また、詳細は割愛しますが、cygwin 上の Perl 5.10.0 と Ruby 1.8.7 で試した結果
も同様でした。
●結論
処理系が大文字小文字を同一視する方法を提供しているならば、その方法を積極的に
使うべきであり、学生に対してもそのように教えるべきです。
今後社会に出て新しい処理系を扱う学生が /[aA][bB][cC]/ のような古い正規表現の
トリックを覚えることは、動作原理の理解には役立つかもしれませんが、それ以上の
実務的な意味を持ちません。
それよりも、正規表現に標準規格が存在しないことを知り、処理系ごとのマニュアル
をきちんと読む習慣をつけることが、将来にわたって実務に役立つと思います。
# 例外は、古い処理系を使わざるをえない哀れなシステムエンジニア (私もそうでし
た) と、正規表現エンジンを自ら開発しようとする野心的なプログラマぐらいでしょ
うか。:-P
●参考文献
[1] http://www.regular-expressions.info/
[2] http://en.wikipedia.org/wiki/Comparison_of_regular_expression_engines
[3] http://en.wikipedia.org/wiki/List_of_regular_expression_software
[4] http://swtch.com/~rsc/regexp/regexp1.html
|
|