【发布时间】:2015-11-26 20:39:14
【问题描述】:
我让用户可以在我的 Java 服务器上对大量文本执行正则表达式。它是用Pattern 和Matcher Java 类实现的。
在某些情况下,它会导致StackOverflowError。它发生在复杂的正则表达式和/或发生大量匹配时。
Pattern pattern = Pattern.compile(term);
Matcher matcher = pattern.matcher(text);
java.lang.StackOverflowError: null
at java.util.regex.Pattern$Branch.match(Pattern.java:4604) ~[na:1.8.0_45-internal]
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658) ~[na:1.8.0_45-internal]
...
问题是如何限制用户只使用正则表达式的一小部分,以避免此类错误和不必要的高服务器 CPU 使用率。可以用纯 Java 或任何第三方 Java 库来完成吗?
或者也许还有其他可能的解决方案,即只是 try/catch StackOverflowError?
【问题讨论】:
-
除了建议的其他选项之外,还有一个简单的缓存层。不是为了结果,而是为了导致 StackOverflow 的正则表达式和正在编写这些正则表达式的用户。 ConcurrentHashMap
包含 Regex 作为键和 userId 作为值应该足够了。然后如果可能的话,与用户交谈并告诉他们不要运行这些正则表达式。否则,至少在再次运行正则表达式并等待 StackOverflow 之前检查 Map。可以帮助减轻 CPU 负载。