一個01串S能匹配如下表達式當且僅當S是一個可以被3整除的二進制數,
^1((10*1)|(01*0))*10*$
可以手動試一試,輸入如下代碼到瀏覽器的控制台,回車運行:
javascript:alert(/^1((10*1)|(01*0))*10*$/.test("1000000100"))
原理其實很簡單,雖然我還不會正則表達式,這里只解釋下其對應的有限狀態自動機。
有限狀態自動機和正則表達式是可以相互轉化的。
建立有限狀態自動機,定義每個狀態為模3的余數,起始態和終態都是0,
舉個例子:
對於 S=11011,初始在狀態0,S取第一位1,到狀態1;S取第二位1,到狀態0;S取第三位0,仍在狀態0;S取剩下兩位,0變1又回到0。最終在0,說明S模3的余數為0,能整除。
參考鏈接: