hns - 日記自動生成システム - Version 2.19.7

void GraphicWizardsLair( void ); //

otsune GWL
FreeBSD, AfterEffects, RETAS, animo, DigitalAnime, Linux, Mac OS, Win2k

[Who is otsune?] [title] [message] [Policy] [注目エントリー] [top]
Twitter Status :


Namazu for hns による簡易全文検索
詳しくは 詳細指定/ヘルプを参照して下さい

検索式:

先月 2007年10月 来月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31


2007年10月20日() [長年日記]

#1 [unix][sysadmin][regexp] シェルで使う「*.jpg」みたいなglobと、PerlやJavaScript等で使う「.+\.jpg$」という正規表現は全く別物だけど、混同されている気がした

AutoPagerize_ というめちゃくちゃ便利なFirefoxのGreaseMonkeyスクリプトが有る。簡単に言うと「次のページ」というリンクで分離されているWebページを自動的に読み込んで、ページの本文を継ぎ足して一気に読める機能のスクリプト。
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文字
正規表現(regexp)
  • hoge{1,2} → hoge と hogee
  • hoge* → hog か hoge か hogee か hogeee か hogeeee か(以下続く)
  • hoge? → hog と hoge
文字クラスの範囲指定[0-9]とか[a-z]はグロブでも正規表現でも同じ動作をするはず。
文字クラス否定はグロブは[!0-9]で、正規表現は[^0-9]だから違うけど。これはグロブの表記であまり使わないと思うので、混同して困る事はすくないだろうなぁ。
最近はJavaScriptブームで、location.href.matchでurlに対して正規表現を使うことが増えた気配がする。逆にPerlやRubyやPythonでGlob指定でローカルファイルを指定する事は減ったかも?(File::Spec的なOSに依存しないモジュールを使うほうが今時だよね)
だから最低でも
  • 正規表現で「任意の文字列にmatch」を書く時は * じゃなくて .+ と書く
  • 正規表現の ? はその前の文字が有っても無くても良いという意味。任意の一文字matchは . と書く
  • . だけにmatchしたいときは \. とエスケープする
というのは覚えておいても良いかも。

1 最近だとFirefoxのAdBlockとかで「http://example.com/*」みたいなglob風の指定をするんだっけか:

シェルのグロブと誤解しているからというよりは、その手のglob風ワイルドカード表記と混同しているってのがありそげ。
Permalink: http://www.otsune.com/diary/2007/10/20/1.html#200710201
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2007-10-20 00:00:00 By otsune