我有一小段代码:
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
答案 0 :(得分:2)
答案 1 :(得分:2)
这种行为肯定是一个错误。
这可能是JS RegExp实现中常见且有意的错误。如果RegExp运行“太长”,则某些实现会放弃并声称不匹配。
我猜测(因为我还没有检查),由于RegExp需要很长时间才能完成,因此VM的RegExp实现很难解决。有问题的RegExp看起来非常像会导致灾难性的回溯(在输入的长度上占用指数时间)。这可以解释为什么增加长度会导致它突然放弃并说它不匹配,即使显然应该这样。