你体验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