3 回答

TA貢獻1865條經驗 獲得超7個贊
您說您了解這部分,但是為了強調,生成的字符串的長度等于提供的數字。因此,當且僅當字符串包含三個字符n == 3。
.?
正則表達式的第一部分說:“任何字符,零次或一次”。因此,基本上有零個或一個字符-或,按照我上面提到的,n == 0 || n == 1。如果我們有匹配項,則返回該否定項。這與零和一不是質數這一事實相對應。
(..+?)\\1+
正則表達式的第二部分有些麻煩,它依賴于組和反向引用。組是括號內的任何內容,然后將由正則表達式引擎捕獲并存儲以供以后使用。反向引用是一個匹配的組,稍后將在同一正則表達式中使用。
該組捕獲1個字符,然后捕獲1個或更多字符。(+字符表示一個或多個,但僅表示前一個字符或組。因此,這不是“兩個或四個或六個等字符”,而是“兩個或三個等?!?+?類似于+,但是它會嘗試匹配盡可能少的字符。+通常會嘗試對整個字符串進行吞噬,這在這種情況下很糟糕,因為這會阻止反向引用部分正常工作。)
下一部分是反向引用:同一組字符(兩個或更多)再次出現。所述反向引用出現一次或多次。
所以。捕獲的組對應于捕獲的自然字符數(從2開始)。該組然后出現一些自然的次數(也從2開始)。如果存在匹配項,則意味著可以找到兩個大于或等于2的數字的乘積,該兩個數字與n長度的字符串匹配……意味著您有一個復合n。再次返回成功匹配的否定:n不是素數。
如果找不到匹配項,那么您將無法得出兩個大于或等于2的自然數的乘積...并且您同時具有不匹配項和素數,因此再次返回否定項比賽結果。
你現在看到了嗎?這真是令人難以置信的棘手(而且計算量很大?。?,但是一旦獲得它,它同時也很簡單。:-)
如果您還有其他問題,例如正則表達式解析的實際工作方式,我可以詳細說明。但是我現在試圖使這個答案簡單(或盡可能簡單)。

TA貢獻1884條經驗 獲得超4個贊
不錯的正則表達式技巧(盡管效率很低)... :)
正則表達式對非素數的定義如下:
當且僅當N <= 1或N被K> 1整除時,N不是素數。
與其傳遞N的簡單數字表示形式到正則表達式引擎,不如給它提供長度為 N 的序列,該序列由重復字符組成。析取的第一部分檢查N = 0或N = 1,第二部分使用后向引用尋找除數K> 1。它迫使正則表達式引擎找到一些可以重復至少兩次以形成序列的非空子序列。如果存在這樣的子序列,則意味著其長度除以N,因此N不是素數。
添加回答
舉報