2007-09-12

JavaScriptの正規表現における「.(dot)」

FirefoxやOperaでは、正規表現の「.(dot)」は改行を除く任意の文字にマッチします(IEでは改行を含む任意の文字にマッチします)。ECMAScript(ECMA-262)では、「.」は改行を含まないことになっているので、規格通りの挙動と言えます。

では、改行を含むすべての文字にマッチさせたいときはどうすれば良いのでしょう?[\S\s]のように書けば任意の文字にマッチしますが、あまりスマートな表現ではない気がします。

2007-09-09

文字列リテラルにマッチする正規表現

JavaScriptの正規表現で、文字列リテラル(引用符「"」で囲まれた文字列、例えば、"abc")に一致するパターンを考えてみた。

/".*?"/で済めば良いのだが、これでは文字列中にエスケープされた引用符(\")が存在する場合に対処できない。文字列を閉じる引用符の直前にバックスラッシュ(\)が無ければ良いと考えて/".*?[^\\]"/としてみるも、今度はバックスラッシュがエスケープされていた場合(例えば、"abc\\")に対処できない。

試行錯誤の結果、/"(.*?[^\\])??(\\\\)*"/という結論に至った。前半が「(...)??」という形になっているのは「""」や「"\\"」にもマッチさせるため。

追記(2007-10-19)

コメントでもっと良い表現を教えていただきました。教えていただいたのはJavaの正規表現で、JavaScriptの正規表現リテラルに直すと/"([^\\"]|\\.)*?"/となります。

追記(2007-11-18)

上記の正規表現ですが、「[^\\"]」の部分でエスケープされていない「"」を含まないようになっているので、「(...)*?」のように「*?」を使う必要はなく、「*」で十分です。つまり、文字列リテラルに一致する正規表現は/"([^\\"]|\\.)*"/となります。

2007-09-06

Windows XPでハードリンクを作成する

以下のコマンドでハードリンクを作成できる。

fsutil hardlink create 新しいファイル 既存のファイル

ただし、ファイルシステムがNTFSの場合のみ。