当我在 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"