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+中的灾难性回溯正则表达式示例[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

灾难性回溯搜索括号中的数字

正则表达式模式灾难性回溯

这个正则表达式不应该发生灾难性的回溯

如何彻底避免正则表达式的灾难性回溯?

正则表达式灾难性回溯

如何使这个正则表达式不会导致“灾难性回溯”?