正規表現のキャプチャの応用
キャプチャした部分文字列を、文字クラスや先読みに転用できることに気づいた。
順不同の組み合わせ
例えば、ショートカットキーを表す文字列(ここでは ctrl+shift+alt+x
とする)にマッチする正規表現において、ctrl
と shift
と alt
の順番に関わらずマッチさせたい場合。
全ての組み合わせを列挙する方法もあるけれど
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