javascript正規表現
解決したいこと
JavaScriptのコードをKindごとにハイライトしたく、トークン化するためにまず数値にマッチする正規表現を作成したのだが、この正規表現が正しいかを教えていただきたい。
発生している問題・エラー
以下のような正規表現を考えた。
/^[+-]?(?:0b(?:[01]_?)*[01]|0o(?:[0-7]_?)*[0-7]|0x(?:[0-9a-f]_?)*[0-9a-f]|(?:\d_?)*\d(?:\.(?:\d_?)*\d)?(?:e[+-]?(?:\d_?)*\d)?|0\d+)$/i
検証
const regex = /^[+-]?(?:0b(?:[01]_?)*[01]|0o(?:[0-7]_?)*[0-7]|0x(?:[0-9a-f]_?)*[0-9a-f]|(?:\d_?)*\d(?:\.(?:\d_?)*\d)?(?:e[+-]?(?:\d_?)*\d)?|0\d+)$/i;
regex.test(""); // false
regex.test("abc"); // false
regex.test("123abc"); // false
regex.test("0"); // true
regex.test("123456789"); // true
regex.test("123_456_789"); // true
regex.test("1_2_3_4_5_6"); // true
regex.test("1_2_3_"); // false
regex.test("_1_2_3"); // false
regex.test("1__2_3"); // false
regex.test("+123"); // true
regex.test("-123"); // true
regex.test("123.456"); // true
regex.test("-123.456"); // true
regex.test("123.4a6"); // false
regex.test("1_2_3.4_5_6"); // true
regex.test("123_.456"); // false
regex.test("123.4__56"); // false
regex.test("123.456.789"); // false
regex.test("789e3"); // true
regex.test("789e+3"); // true
regex.test("789e-3"); // true
regex.test("789e"); // false
regex.test("1_2_3e4_5_6"); // true
regex.test("123_e456"); // false
regex.test("123e4__56"); // false
regex.test("123.456e789"); // true
regex.test("123.456e-789"); // true
regex.test("1_2_3.4_5_6e7_8_9"); // true
regex.test("0b1100"); // true
regex.test("-0b1100"); // true
regex.test("0b1234"); // false
regex.test("0b1100_0110_0101"); // true
regex.test("0b10.1"); // false
regex.test("0b10e1"); // false
regex.test("0o123"); // true
regex.test("0o56789"); // false
regex.test("0o123.456"); // false
regex.test("0o123e456"); // false
regex.test("0123"); // true
regex.test("0_1_2_3"); // true
regex.test("01_2_3"); // true
regex.test("0x123acf"); // true
regex.test("0xabcdefg"); // false
regex.test("0x1_2_3_a_b_c"); // true
regex.test("0x123.456"); // false
regex.test("0x123e"); // true
regex.test("0x123e456"); // true
regex.test("0x123e-456"); // false
これ以外にJavaScript側では数値として認識するが、この正規表現ではマッチできないものや、逆にこの正規表現にだけマッチする文字列があったら教えていただきたい。
0