Java 9+中的灾难性回溯正则表达式示例[关闭]
Posted
技术标签:
【中文标题】Java 9+中的灾难性回溯正则表达式示例[关闭]【英文标题】:Catastrophic Backtracking regular expression example in Java 9+ [closed] 【发布时间】:2020-10-09 12:45:44 【问题描述】:有人有 catastrophic backtracking in a regular expression 的示例,它在 Java 11 中有效吗?大多数常见的例子(如“(a+a+)+b”)是fixed since java 9。最好的是没有反向引用,不知道在 JDK 9+ 中是否可行。
在我们的应用程序中,我们有一个控制这种回溯的逻辑,为了测试这个逻辑,我们使用了表达式“(x+x+)+y”。升级到 JDK 11 后不再导致需要行为。
【问题讨论】:
我觉得你的问题需要更多细节来解释你的问题。 添加了更多上下文和信息 【参考方案1】:我正在运行 java 14 并且回溯问题仍然存在。失败需要以下大约 6 秒。
String regex = "(a+a+a+a+a+a+)+b";
String str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaac";
System.out.println(str.matches(regex));
这可以通过使用独立组(?>X)
来防止。一旦组第一次匹配,引擎会检查以下是否匹配b
。如果没有,则无需重复,因为回溯不会改变结果。所以它会立即失败(即使对于更大的表达式和/或测试字符串)。
String regex1 = "(?>(a+a+a+a+a+a+)+)b";
System.out.println(str.matches(regex1));
【讨论】:
谢谢,加长表达式和测试字符串都有帮助。 当然,6 秒和 Java 8 的“几乎永不返回”是有区别的……以上是关于Java 9+中的灾难性回溯正则表达式示例[关闭]的主要内容,如果未能解决你的问题,请参考以下文章