java - Pattern.matches() 给出 StackOverflowError

标签 java regex stack-overflow

我正在使用 java 的 Pattern.matches 将数据 block 与正则表达式匹配。数据 block 可以是单行或多行。问题是,一旦我的数据超过 15 行(通常超过 17-18 行),我就会开始收到 stackoverflowerror。对于少于 15 行的数据,正则表达式工作正常。

正则表达式是这样的格式:
域名 -> 空格 -> , -> 空格 -> 数字 -> 空格 -> , -> 空格 -> 数字 -> 换行

String regex = "^(([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+([a-zA-Z]{2,})\\s*,\\s*\\d+\\s*,\\s*\\d+(\\r?\\n)?)+$";

我用来测试这个正则表达式的数据 block 是这个

abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456
abc.com, 123, 456

这是代码:

String regex = "^(([a-zA-Z0-9][a-zA-Z0-9\\-]*\\.)+([a-zA-Z]{2,})\\s*,\\s*\\d+\\s*,\\s*\\d+(\\r?\\n)?)+$";
boolean valid = Pattern.matches(regex, data); //fails here

最佳答案

我不能告诉你这个错误的原因;正则表达式本身很好,不会出现灾难性的回溯或任何其他明显的错误。

也许您可以通过使用 possessive quantifiers 来减少正则表达式引擎保存的回溯位置数。 (++ 代替 +*+ 代替 *{2,}+ 而不是 {2,} 等)。此外,您不需要捕获组(感谢 Thomas),所以我将它们更改为非捕获组:

"(?:(?:[a-zA-Z0-9][a-zA-Z0-9-]*+\\.)++([a-zA-Z]{2,}+)\\s*+,\\s*+\\d++\\s*+,\\s*+\\d++(\r?+\n)?+)++"

这不会改变正则表达式的行为(除了删除不必要的 anchor ,因为您正在使用 Pattern.matches()),但也许它有助于避免 StackOverflows。我没有安装 Java SDK,因此无法自行测试。

关于java - Pattern.matches() 给出 StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7662613/

相关文章:

java - 如何使用 thymeleaf 替换 html 中的文本

php - 如何使用 preg_replace 将类名注入(inject) html 节点?

c - 在 GCC 中禁用堆栈保护不起作用

c - 运行时错误(堆栈溢出)

java - 为什么这个 toString() 方法会导致 StackOverFlowError?

java - 是否可以从 MD5 和 Java 恢复消息?

java - Drools引擎和数据库之间的区别

java - Appletviewer 抛出 java.lang.NoClassDefFoundError 异常

excel - 从 VBA 中的范围中删除特殊字符

python - 如何使用正则表达式匹配捕获组 1