Dart 当String.endsWith接受字符串时,为什么String.startsWith接受模式作为输入

Dart 当String.endsWith接受字符串时,为什么String.startsWith接受模式作为输入,dart,Dart,这两种方法之间的接口不匹配,这两种方法做的事情非常相似 bool endsWith(String other) bool startsWith(Pattern pattern, [int index=0]) 原因是什么?作者的想法是什么?模式的API不提供任何向后搜索匹配的方法。如果endsWith采用了一种模式,则需要逐个尝试从字符串后面查找匹配项(最有可能是O(n^2)) 请注意,您不能仅使用模式.allMatches并查看最后一次匹配是否在输入结束时结束: var re = new Re

这两种方法之间的接口不匹配,这两种方法做的事情非常相似

bool endsWith(String other)
bool startsWith(Pattern pattern, [int index=0])

原因是什么?作者的想法是什么?

模式的API不提供任何向后搜索匹配的方法。如果
endsWith
采用了一种模式,则需要逐个尝试从字符串后面查找匹配项(最有可能是O(n^2))

请注意,您不能仅使用
模式.allMatches
并查看最后一次匹配是否在输入结束时结束:

var re = new RegExp('a|ab');
re.allMatches('ab'); // => one match: 'a'.

在本例中,只有“a”匹配,如果我们使用
allMatches
迭代器来确定字符串是否以给定的正则表达式结尾,它将错误地失败。

这是一个好问题。。。如果您有一个带有startsWith的可选索引,那么您可以将该模式推到任何地方,而不仅仅是开始。这样,endsWith可能只是一个方便的函数。看起来他们应该将startsWith重命名为patternMatch()。我假设regexp引擎能够通过反向遍历状态机进行向后搜索是正常的,但事实证明,唯一能够这样做的regexp引擎也是.NET中的一个,非常不幸的是,您不能简单地扩展模式并用$We锚定它的结尾,我们使用了与JS相同的正则表达式。他们跑得很快,还不错。Net:您仍然需要创建一个新的FSM,但它应该是可行的。即使这样,您也需要更改模式接口。目前它相对简单,但使用
searchBack
则更难实现。