奇淫怪巧 利用正規表示式判斷素數

2022-03-07 15:36:10 字數 982 閱讀 6898

最近在學習正規表示式,偶然間看到利用正規表示式判斷乙個數是不是素數的帖子。當時就震驚了,覺得好神奇。那個判斷素數的函式是這樣子的:

public static bool isprime(int i)

有沒有覺得很神奇?我當時就覺得相當的有想象力的一種實現。那讓我們看一下這個正規表示式是如何做判斷素數的。

過程很簡單。讓我們看一下這個正規表示式。

能被這個正規表示式匹配出則這個數不是素數,這個正規表示式可以分成兩部分看,

這個表示式基本內容解釋完了,那麼為什麼能夠匹配非素數呢?

匹配的過程大致是這樣子的,(..+?)首先匹配2個字元,然後\1+匹配2的倍數個字元,如果能夠匹配是不是就說明了這個數是2的倍數啦?當匹配失敗的時候,匹配引擎將(..+?)匹配三個字元,然後\1+匹配3的倍數個字元,如果能夠匹配則是3的倍數。依此類推。。。。。。

如果匹配了則說明這個數必定能夠被某乙個數整除,如果匹配完都沒匹配到則說明從2到n-1的數都不能整除n,那就證明這個數是素數!

題外話(..+?)?的作用,我認為這個是為了提高效能的。如果沒有?的話(..+?)會試圖把所有的字元都匹配完,然後發現後面還有表示式,於是從最後乙個位置開始回溯。而加了?則是從第二個就開始往後去匹配。

打個比方:我們匹配12。^.?$|^(..+)\1+$會做的事情是先判斷12是不是11的倍數、then 12是不是10的倍數........then 12是不是6的倍數。^.?$|^(..+?)\1+$會做的是先判斷12是不是2的倍數,then 就沒then了。對於素數的效率是一樣的,因為每個位置都需要匹配過來,但是對於非素數從小開始匹配則能夠讓這個表示式早點結束匹配。

如果你覺得我解釋的不清楚沒明白,下面有其他人的解釋:

正規表示式的奇淫技巧

駝峰名轉下劃線 componentmapmodelregistry match a z a z0 9 a z a z0 9 g join tolowercase component map model registry獲取url引數 function wordcount data else retu...

利用正規表示式檢查素數

本帖最後由 遇見sharon 於 2013 8 12 17 09 編輯 一般來說,我們會使用正規表示式來做字串匹配,今天在網上瀏覽的時候,看到了有人用正規表示式來檢查乙個數字是否為素數 質數 讓我非常感興趣,這個正規表示式如入所示 要使用這個正規則表示式,你需要把自然數轉成多個1的字串,如 2 要寫...

正規表示式判斷

public class test 校驗輸入的qq號碼是否符合規則 param qq return public static boolean checkqq1 string qq 如果qq號碼中有任何一位不是數字,就直接返回false for int i 0 i qq.length i 如果首位是...