你體驗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
http://stackoverflow.com/questions/8316284/why-regex-ismatch-hangs –
@sawa:我的題目本身訴問題。我不想在正文內容中再次寫入。仍然你不理解,請離開它。 – Mohanraj
@UriAgassi:感謝相關問題。 – Mohanraj