簡體   English   中英

二進制數的正則表達式可被5整除

[英]Regular Expression for Binary Numbers Divisible by 5

我想寫一個二進制數的正則表達式,可以被5整除。
我已經完成了二進制數的正則表達式,可以被2和3整除,但我找不到一個用於5。

有什么建議?

(0|1(10)*(0|11)(01*01|01*00(10)*(0|11))*1)*

添加^$以使用regexp對其進行測試。 看到它在這里工作


您可以構建DFA並將其轉換為正則表達式。 DFA已經在另一個答案中構建。 你可以閱讀它,它解釋得非常好。
一般的想法是刪除節點,添加邊。 之前

變為:

后


使用此轉換和我鏈接的答案中的DFA,以下是獲取正則表達式的步驟: 步驟1 第2步 第三步: 第4步 STEP5

2^0 =  1 =  1 mod 5
2^1 =  2 =  2 mod 5
2^2 =  4 = -1 mod 5
2^3 =  8 = -2 mod 5
2^4 = 16 =  1 mod 5
2^5 = 32 =  2 mod 5
   ...     -1 mod 5
   ...     -2 mod 5

所以我們有一個1,2,-1,-2模式。 有兩個子模式,其中只有數字的符號交替:設n是數字編號,最低有效數字的編號是0; 奇怪的模式是

(-1)^(n)

甚至模式是

2x((-1)^(n))

那么,如何使用呢?

讓原始數字為100011,將數字數字分成偶數和奇數兩部分。 分別對每個零件數字求和。 將奇數位的總和乘以2.現在,如果結果可以被偶數位的總和整除,則原始數字可以被5整除,否則它不可被整除。 例:

100011
1_0_1_ 1+0+1 = 2
_0_0_1 0+0+1 = 1; 1x2 = 2

2 mod(2) equals 0? Yes. Therefore, original number is divisible.

如何在正則表達式中應用它? 使用正則表達式中的標注函數可以應用它。 標注提供了一種在正則表達式模式匹配過程中臨時將控制傳遞給腳本的方法。

但是,ndn的答案更合適也更容易,因此我建議使用他的答案。

但是,“^(0 | 1(10)*(0 | 11)(01 * 01 | 01 * 00(10)*(0 | 11)) 1) $”匹配空字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM