Webサイトによってどこが本文なのかはまちまちなので、urlを正規表現でmatchしてそれに応じたSITEINFOと呼ばれる設定データを使う。(Wikiでユーザーが設定ファイルを自由に修正することができる)
さて本題。
たとえば「http://www.example.com/path/to/12345.html」というurlで、数字の部分は任意な数字にmatchさせたい場合は
http://www\.example\.com/path/to/[0-9]+\.html$という正規表現を使う。[0-9]は\dという指定も出来るので
http://www\.example\.com/path/to/\d+\.html$でもOk。
正規表現の.は「任意の一文字にmatch」という意味なので「http://wwwAexample.com/path/to/12345Ahtml」みたいなurlにmatchする誤爆を許容するのであれば
http://www.example.com/path/to/\d+.htmlでもなんとかmatchはする。(あまり厳密ではないので個人的には好きじゃない。末尾の$は外しても良いかなぁとは思うけど)
でも間違いやすいのが
http://www.example.com/path/to/*.htmlという表記。これだと/path/to以降が「/の0文字以上の繰り返し」と「任意の一文字」と「html」という指定なので、path/to/12345.htmlという狙ったurlにはmatchしない。
これはおそらくunixシェルのグロブとか、それを真似たMS-DOSプロンプトの「*」による「任意の文字の連続にmatch」と誤解しているからだろう。
ということで、グロブと正規表現で同じ表記をするけど動作の違う間違いやすいところを列記する。
shellのglob展開
- hoge{1,2} → hoge1と hoge2
- hoge* → hoge と 任意n文字
- hoge? → hoge と 任意1文字
- hoge{1,2} → hoge と hogee
- hoge* → hog か hoge か hogee か hogeee か hogeeee か(以下続く)
- hoge? → hog と hoge
文字クラス否定はグロブは[!0-9]で、正規表現は[^0-9]だから違うけど。これはグロブの表記であまり使わないと思うので、混同して困る事はすくないだろうなぁ。
最近はJavaScriptブームで、location.href.matchでurlに対して正規表現を使うことが増えた気配がする。逆にPerlやRubyやPythonでGlob指定でローカルファイルを指定する事は減ったかも?(File::Spec的なOSに依存しないモジュールを使うほうが今時だよね)
だから最低でも
- 正規表現で「任意の文字列にmatch」を書く時は * じゃなくて .+ と書く
- 正規表現の ? はその前の文字が有っても無くても良いという意味。任意の一文字matchは . と書く
- . だけにmatchしたいときは \. とエスケープする
最近だとFirefoxのAdBlockとかで「http://example.com/*」みたいなglob風の指定をするんだっけか:
シェルのグロブと誤解しているからというよりは、その手のglob風ワイルドカード表記と混同しているってのがありそげ。



コメントを読む(1) [ コメントする ]