正規表現のキャプチャの応用

キャプチャした部分文字列を、文字クラスや先読みに転用できることに気づいた。

順不同の組み合わせ

例えば、ショートカットキーを表す文字列(ここでは ctrl+shift+alt+x とする)にマッチする正規表現において、ctrlshiftalt の順番に関わらずマッチさせたい場合。

全ての組み合わせを列挙する方法もあるけれど

var regexp = /^(?:(?:ctrl\+(?:shift\+alt|alt\+shift))|(?:shift\+(?:ctrl\+alt|alt\+ctrl))|(?:alt\+(?:ctrl\+shift|shift\+ctrl)))\+x$/;

regexp.test("alt+shift+ctrl+x");  // => true
regexp.test("alt+ctrl+alt+x");    // => false

キャプチャと否定先読みを組み合わせれば、少しすっきりする。

var regexp = /^(ctrl|shift|alt)\+(?!\1)(ctrl|shift|alt)\+(?!\1|\2)(?:ctrl|shift|alt)\+x$/;

regexp.test("alt+shift+ctrl+x");  // => true
regexp.test("alt+ctrl+alt+x");    // => false