java.lang.StackOverflowError 使用正则表达式解析大字符串

标签 java regex stack-overflow

这是我的正则表达式

((?:(?:'[^']*')|[^;])*)[;]

它用分号标记字符串。例如,

Hello world; I am having a problem; using regex;

结果是三个字符串

Hello world
I am having a problem
using regex

但是当我使用一个大的输入字符串时,我得到了这个错误

Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)
at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345)
at java.util.regex.Pattern$Branch.match(Pattern.java:4114)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168)
at java.util.regex.Pattern$Loop.match(Pattern.java:4295)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227)

这是怎么引起的,我该如何解决?

最佳答案

不幸的是,Java 的内置正则表达式支持在正则表达式包含重复替代路径(即 (A|B)*)时存在问题。这被编译为递归调用,当用于非常大的字符串时会导致 StackOverflow 错误。

一种可能的解决方案是重写您的正则表达式以不使用重复的替代方案,但如果您的目标是在分号上标记字符串,那么您根本不需要复杂的正则表达式,只需使用 String.split()用一个简单的 ";" 作为参数。

关于java.lang.StackOverflowError 使用正则表达式解析大字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7509905/

相关文章:

java - 如何使用用户输入在网格上随机打印星号

python - 如何使用正则表达式在 OPML (XML) 文件中查找带引号的属性值

c - 如果有堆栈溢出,linux 会告诉我吗?

java - java扫雷游戏中的Stackoverflow异常

java - LocalDate比较,获取两个日期之间的订单

java - 如何使用Jsp JSTL显示Spring模型?

java - 设置Heroku模板java应用程序的开发环境

python - 从字符串中去除数字

有效网站链接的正则表达式

memory-management - 将 Box 中的大值复制到 Rust 中的 Vec 中,而不会破坏堆栈