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の場合のみ。

2007-08-19

すべてのコマンドライン引数に対して処理を行うバッチファイルの作成

ドラッグ&ドロップされたすべてのファイルに対して処理を行うバッチファイルの書き方について。

バッチファイルのコマンドライン引数は%nnは0から9までの数字。ただし、%0はバッチファイル自身)で参照できる。しかし、この方法では%1から%9の9つの引数しか扱えない。そこで、gotoコマンドを使ったループとshiftコマンドを用いて、すべてのコマンドライン引数を処理する。

:loop

if "%~1" == "" goto end

rem ここに%1に対して処理を書く。例えば次のように。
echo %1

shift

goto loop

:end

echo %1」のところに処理を記述する(ここでは単に%1の内容を出力しているだけ)。

コマンドライン引数が確実に1つ以上あるとわかっている場合は以下のようにも書ける。

:loop

echo %1

shift

if not "%~1" == "" goto loop

%1が空かどうかを判定するところで%~1としているのは、%1の内容から引用符(")を取り除くため。そうしないと%1が引用符で囲まれている場合(例えば、空白文字を含むパスが渡されたとき)にうまく処理されない。

2007-03-04

HTML/XHTML 関連仕様書一覧

移動しました。

2007-03-03

XSLT & XPath 仕様書一覧

以下のページに移動しました。