当我在 groovy 中使用正则表达式替换时如何求解 java.lang.StackOverflowError?
how solver java.lang.StackOverflowError when I use a regex replace in groovy?
我试图在大文件中使用此命令,但出现此错误:java.lang.WhosebugError
这是我的代码
stringx.replaceAll(/(\n.*?;(.*?);.*?;.*?;.*?;.+)(\n.*?;;.+)+/, '\ntitle\n\n\n')
这看起来像 catastrophic backtracking 的另一种情况,每个 .*?;
都试图匹配文本的一小部分,直到 some ;
。但是由于 .
也可以匹配 ;
当整个正则表达式匹配时,正则表达式引擎将需要回溯并尝试寻找匹配 .*?
子表达式的不同方式。所以它会尝试 "stretch out" 其中一些 and/or 限制其他人以使匹配成为可能。伸展将允许在匹配中包含 ;
,并且由于这里有 很多 的可能性要检查(并且正则表达式引擎正在使用一些递归的事实)你最终WhosebugError
.
为了防止 .*?;
匹配 ;
之后的更远文本,我们可以将其限制为仅匹配非分号字符,直到它之后的第一个分号。所以我们可以用 [^;\r\n]*;
替换每个 .*?;
(我们也可以用这种方式去掉不情愿的量词)。
非常抱歉放了两个答案,但我增加了堆栈大小以使用此命令解决 groovy 中的这个问题谢谢大家帮助我
导出 JAVA_OPTS="$JAVA_OPTS -Xss16m"
我试图在大文件中使用此命令,但出现此错误:java.lang.WhosebugError
这是我的代码
stringx.replaceAll(/(\n.*?;(.*?);.*?;.*?;.*?;.+)(\n.*?;;.+)+/, '\ntitle\n\n\n')
这看起来像 catastrophic backtracking 的另一种情况,每个 .*?;
都试图匹配文本的一小部分,直到 some ;
。但是由于 .
也可以匹配 ;
当整个正则表达式匹配时,正则表达式引擎将需要回溯并尝试寻找匹配 .*?
子表达式的不同方式。所以它会尝试 "stretch out" 其中一些 and/or 限制其他人以使匹配成为可能。伸展将允许在匹配中包含 ;
,并且由于这里有 很多 的可能性要检查(并且正则表达式引擎正在使用一些递归的事实)你最终WhosebugError
.
为了防止 .*?;
匹配 ;
之后的更远文本,我们可以将其限制为仅匹配非分号字符,直到它之后的第一个分号。所以我们可以用 [^;\r\n]*;
替换每个 .*?;
(我们也可以用这种方式去掉不情愿的量词)。
非常抱歉放了两个答案,但我增加了堆栈大小以使用此命令解决 groovy 中的这个问题谢谢大家帮助我
导出 JAVA_OPTS="$JAVA_OPTS -Xss16m"