我需要匹配一個數字範圍:可以重構這個數字範圍的正則表達式嗎?
-9223372036854775808到
^(?:922337203685477580[0-7]|9223372036854775[0-7]\d{2}|922337203685477[0-4]\d{3}|92233720368547[0-6]\d{4}|9223372036854[0-6]\d{5}|922337203685[0-3]\d{6}|92233720368[0-4]\d{7}|9223372036[0-7]\d{8}|922337203[0-5]\d{9}|92233720[0-2]\d{10}|922337[0-1]\d{12}|92233[0-6]\d{13}|9223[0-2]\d{14}|922[0-2]\d{15}|92[0-1]\d{16}|9[01]\d{17}|[1-8]\d{18}|\d{0,18}|-(?:922337203685477580[0-8]|9223372036854775[0-7]\d{2}|922337203685477[0-4]\d{3}|92233720368547[0-6]\d{4}|9223372036854[0-6]\d{5}|922337203685[0-3]\d{6}|92233720368[0-4]\d{7}|9223372036[0-7]\d{8}|922337203[0-5]\d{9}|92233720[0-2]\d{10}|922337[0-1]\d{12}|92233[0-6]\d{13}|9223[0-2]\d{14}|922[0-2]\d{15}|92[0-1]\d{16}|9[01]\d{17}|[1-8]\d{18}|\d{0,18}))?$
// space for easier copy and paste
是的,我知道這聽起來很瘋狂,但有一個很長的故事背後。我不知道如何通過檢查一個範圍,因爲數字的大小,在JavaScript中做到這一點,這必須是準確的。
這是打破這件事的思考過程。我剛開始使用最大數量,然後開始工作,然後在正則表達式中加入 - 來處理負數。你顯然必須在某處複製並粘貼這個東西才能看到它。另外,可能是錯誤。讓我的頭幾乎爆炸。
- 9,223,372,036,854,775,807
- 922337203685477580 [0-7]
- 9223372036854775 [0-7] [0-9] {2}
- 922337203685477 [0-4] [0-9] {3}
- 92233720368547 [0-6] [0-9] {4}
- 9223372036854 [0-6] [0-9] {5}
- 922337203685 [0-3] [0-9] {6 }
- 92233720368 [0-4] [0-9] {7}
- 9223372036 [0-7] [0-9] {8}
- 922337203 [0-5] [0-9] {9}
- 92233720 [0-2] [0-9] {10 }
- 922337 [0-1] [0-9] {12}
- 92233 [0-6] [0-9] {13}
- 9223 [0-2] [0-9] { 14}
- 922 [0-2] [0-9] {15}
- 92 [0-1] [0-9] {16}
- 9 [01] [0-9] {17 }
- [1-8] [0-9] [18]
- [0-9] {0,18}
有在負與正不同的一個數字,所以你會看到我必須基本上覆制大部分。
那麼幾個問題:
- 難道我這樣做對嗎?
- 如果不是,有什麼更好的方法?
- 考慮到數字的大小,這可以在沒有正則表達式的情況下完成嗎?我需要驗證客戶端。
- 它可以重構,仍然保留嚴格的規則?
建議表示讚賞:)
我不是專業的性能測試。我確實想過把它分解成一系列「if」陳述。你認爲這樣做會更好嗎?如果性能較差,我可能會選擇將它放在一個大的正則表達式中,因爲其他許多原因都不值得我的問題混淆。 – user1447679
性能差異可能很小(考慮到程序的其餘部分)。我會避免大的正則表達式爲可讀性。 – Thilo
瘋狂的想法將字符串分解成已知的塊,然後比較具有已知數值範圍的單獨字符串,即數字-20 x1 || li1 === x1 && li2> x2),那麼這個數字低於允許的下限。只是一個想法。如果問題太大而無法解決。把它分解成更小的片斷 –