gpt4 book ai didi

java - Pattern.matches() 给出 StackOverflowError

转载 作者:太空狗 更新时间:2023-10-29 22:34:53 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com