最近在學習正規表示式,偶然間看到利用正規表示式判斷乙個數是不是素數的帖子。當時就震驚了,覺得好神奇。那個判斷素數的函式是這樣子的:
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 如果首位是...