2016-02-22 166 views
-1

我:正則表達式時掛起輸入字符串包含括號

vv = /added:\s{0,}\d{1,2}\/\d{1,2}\/\d{4}|terminated:\s{0,}\d{1,2}\/\d{1,2}\/\d{4}|(?-mix:\((\w+([\p{P}\s]{,3}\w*)*)\))/i 

下面是我的實驗:

detail = "(value containts lorem ipsum lorum ipsum" 
detail =~ vv 

當我嘗試在不輸入字符串的開始托架,它的工作原理。

detail = "value containts lorem ipsum lorum ipsum" 
detail =~ vv 
# => nil 
+0

http://stackoverflow.com/questions/8316284/why-regex-ismatch-hangs –

+0

@sawa:我的題目本身訴問題。我不想在正文內容中再次寫入。仍然你不理解,請離開它。 – Mohanraj

+0

@UriAgassi:感謝相關問題。 – Mohanraj

回答

1

你體驗catastrophical回溯問題。 \w+([\p{P}\s]{,3}\w*)*會導致問題,因爲([\p{P}\s]{,3}\w*)*包含嵌套的零個或多個量詞*。問題的產生是因爲裏面的部件都是可選的(=可以匹配空字符串)並進行量化。請參閱your regex demo,嘗試再添加一個符號並查看增加的步數:在(value containt之後添加一個空格將使步數從65,742增加一倍到102,610!添加1個符號會使演示崩潰。

\w+(?:[\p{P}\s]{1,3}\w+)*更換它,甚至\w+(?:\W{1,3}\w+)*應該可以解決問題作爲分組(...)構造內的子模式將不再匹配空字符串(但整組將是可選的,零次或多次重複)。 [\p{P}\s]{1,3}需要至少1個標點符號或空格,並且\w+需要一個或多個單詞字符。

還要注意的是,你不需要(?-mix:...)組,我刪除它從我的建議圖案:你有沒有.內(無需m),沒有字母,可以在較低或大寫(無需i),並且模式中沒有空格可以忽略(不需要x)。另外,{0,}量詞等於*,我在開始時替換了一兩個。

使用

vv = /added:\s*\d{1,2}\/\d{1,2}\/\d{4}|terminated:\s*\d{1,2}\/\d{1,2}\/\d{4}|\((\w+(?:[\p{P}\s]{1,3}\w+)*)\)/i 
detail = "(value containts lorem ipsum lorum ipsum" 
detail =~ vv 

Ruby demo

+0

謝謝,它的工作。它會提供與舊的輸出相同的輸出嗎? – Mohanraj

+0

我認爲應該。對建議的子模式的解釋以一種描述性的方式給出,這裏是一個簡潔的版本:*'\ w +(?:\ W {1,3} \ w +)*'將匹配1個以上的單詞字符後跟零個或多個序列1到3個非單詞字符,後跟1個單詞字符*。帶有[[\ s \ p {P}]'的版本匹配1到3個標點或空格。與你的比較(你沒有提供任何要求,我從模式中推導出來)。 –

相關問題