为什么Dart(不)与此RegEx相匹配?

时间:2014-06-04 01:19:00

标签: regex dart

我有一小段代码:

void main() {
    RegExp re = new RegExp(r".*(a+)+\d");
    print("a0aaaaaaaaaaaaa".contains(re));
    print("a0aaaaaaaaaaaaaa".contains(re));
}

输出:

true
false

为什么呢?我希望两者都是真的。

编辑: 我提交了一份错误报告: https://code.google.com/p/dart/issues/detail?id=19193

2 个答案:

答案 0 :(得分:2)

使用Try Dart在线编译器无法重现您的结果,它们都成功返回true,但它确实返回true和{{1}使用另一个Dart compiler

请尝试使用以下内容。

false

答案 1 :(得分:2)

这种行为肯定是一个错误。

这可能是JS RegExp实现中常见且有意的错误。如果RegExp运行“太长”,则某些实现会放弃并声称不匹配。

我猜测(因为我还没有检查),由于RegExp需要很长时间才能完成,因此VM的RegExp实现很难解决。有问题的RegExp看起来非常像会导致灾难性的回溯(在输入的长度上占用指数时间)。这可以解释为什么增加长度会导致它突然放弃并说它不匹配,即使显然应该这样。