rakugakibox.net

技術ノート。兼JS/CSS実験場。 ♡:Java, Spring, AWS.

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

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

JavaScriptでヒアドキュメント

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

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

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

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

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

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

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

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

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

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

// 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>'

どうでもいいけど…