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