【问题标题】:Java regex parser without stack overflow没有堆栈溢出的 Java 正则表达式解析器
【发布时间】:2016-10-07 00:43:07
【问题描述】:

使用java.util.regex 处理正则表达式会导致大字符串和复杂正则表达式的堆栈溢出(尤其是其中包含|)。

有没有办法在 Java 中更防御性地处理正则表达式,比如

  • 正则表达式具有非递归模式
  • 为这些正则表达式抛出一个可捕获的异常(而不是 java.lang.Stackoverflow 错误),

或任何其他不会杀死我的程序或使其处于不可恢复状态的机制?

【问题讨论】:

  • 我建议您尝试简化正则表达式,而不是寻找堆栈溢出错误的解决方案。
  • 没错,这通常是明智的。但是想出一个正则表达式其实很烦人,让它通过所有的单元测试,把它放在一个大的分析程序中看到它在凌晨 2 点崩溃,因为某些输入字符串真的很大。
  • 这个答案已经回答了好几次了。实现一些超时机制:stackoverflow.com/questions/910740/…
  • @WiktorStribiżew:的确,这是一种合理的方法,但也不能令人满意,因为我必须根据我的筹码量来猜测时间限制。我的程序通常在晚上运行以完成某种工作。我不在乎正则表达式是否需要 5 分钟,只要它不会使 JVM 崩溃。
  • 你想在你的程序中做什么?可能是您从不同的角度看待问题。

标签: java regex exception


【解决方案1】:

StackOverflowError 可以像任何异常一样被捕获和处理。错误表示您通常不应该发现的严重问题,但在这种情况下,您知道它是什么并且您需要处理它。只需抓住它并处理这种情况(或重新抛出自定义异常)。

您可能还想考虑使用-Xss 命令行标志来增加堆栈大小。

【讨论】:

  • 我同意第二部分。第一部分似乎有点粗略......处理运行时错误正在解决实际问题。在我看来,如果导致运行时错误,用户应该有效输入并根据要求重新考虑表达式。
  • 是的,@ringbearer,我同意你的看法,最好避免这个问题,至少如果它可以以合理的成本完成的话。在这种情况下,我想提供一种防止损坏的方法,这可能是一个起点,同时等待更好的解决方案(可能会出现也可能不会出现)......
  • 唯一正确的解决方案:只使用acc 编写的正则表达式。以线性方式展开循环原理,其中每个前面的子模式不能与后续子模式匹配相同的字符。
猜你喜欢
  • 2013-08-09
  • 1970-01-01
  • 2013-07-05
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2015-11-24
  • 1970-01-01
相关资源
最近更新 更多