正規表現 “[^]” の意味, 改行にもマッチする正規表現

JavaScript でヒアドキュメントするページで見つけた、
正規表現 [^] の意味が分からなかったので調べてみた。

JavaScript でヒアドキュメント

こちらで見つけたコード。 Node.js が元ネタのよう。
環境依存かもしれないけど、面白い。

(function () {/*
<div class="title">
  <h1>
    <a href="${url}">${title}</a>
  </h1>
</div>
*/}).toString().match(/[^]*\/\*([^]*)\*\/\}$/)[1];

このコードで使われてる正規表現 [^] が見慣れなくて一瞬意味が分からなかった。

たぶん除外する文字がないだけ

[^abc] は ‘a’, ‘b’, ‘c’ を除外した文字。
なので、 [^] は除外する文字なしで何でも OK なのかなー。
記号なので Web 検索で調べにくい。

任意文字を示すドットとの違い

ドット . は改行を除く一文字。
[^] では改行は除かれないようだ。

// Chrome で確認
/./.test("\n");    // => false
/./.test("\r");    // => false
/[^]/.test("\n");  // => true
/[^]/.test("\r");  // => true

他の改行にもマッチする正規表現

改行にもマッチさせたいのなら、こんな方法もあった。

JavaScript で改行にもマッチする正規表現

// Chrome で確認
/[\s\S]/.test("\n");  // => true
/[\s\S]/.test("\r");  // => true

[^] は環境を選ぶっぽい

手元にあった ruby でも叩いてみたら SyntaxError でわろた。
IE でも動かなかったし、 [^] は環境を選ぶっぽい。

irb(main):001:0> /[^abc]/
=> /[^abc]/
irb(main):002:0> /[^]/
SyntaxError: (irb):2: empty char-class: /[^]/
        from /usr/local/bin/irb:12:in `<main>'

どうでもいいけど…