2016-02-22 121 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个标点或空格。与你的比较(你没有提供任何要求,我从模式中推导出来)。 –

相关问题