gpt4 book ai didi

Java Matcher 慢速正则表达式

转载 作者:太空宇宙 更新时间:2023-11-04 07:14:43 26 4
gpt4 key购买 nike

这是非常简单的正则表达式,它在一个非常短的字符串上运行超过 30 秒:(i7 3970k @ 3.4ghz)

Pattern compile = Pattern.compile("^(?=[a-z0-9-]{1,63})([a-z0-9]+[-]{0,1}){1,63}[a-z0-9]{1}$");
Matcher matcher = compile.matcher("test-metareg-rw40lntknahvpseba32cßáàâåäæç.nl");
boolean matches = matcher.matches(); //Takes 30+ seconds

第一部分 (?=) 断言字符串最多包含这些字符

第二部分是断言字符串不超出语法,例如在本例中,以防止 --'s 并至少以 [a-z0-9] 结尾

最佳答案

我试图猜测你的意图,但这并不容易:

(?=[a-z0-9-]{1,63}) 这种预测似乎是要求接下来的最多 63 个字符是小写 ASCII 字母或数字,但事实上,即使只有一个字母后面跟任何东西,它也会成功。所以也许您的意思是 (?=[a-z0-9-]{1,63}$) 禁止在合法的最多 63 个字符之后的任何其他内容。

您似乎希望在 - 之间至少包含一个字母或数字,但您将 - 设为可选,并没有真正创建约束,而是允许多种可能性,从而产生表达式的开销。您可以简单地说:([a-z0-9]++-){0,63}[a-z0-9]+。大括号内的组需要至少一个字母或数字,并且后面需要减号,末尾的表达式需要表达式末尾至少有一个字母或数字,但同时也会匹配最后一组,但不带 -。如果您的文本中根本不包含 -,那么最后一组也可能是唯一的一组。

将它们放在一起,正则表达式将变为:(?=[a-z0-9-]{1,63}$)([a-z0-9]++-){0,63}[a-z0-9]+。请注意,如果使用 matches 方法,则不需要前导 ^ 或尾随 $;它已经暗示字符串边界必须与表达式边界匹配。

我希望我的意图是正确的......

关于Java Matcher 慢速正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20124113/

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