2014-12-29 49 views
2

兩個方法之間存在此接口不匹配,它們的作用非常相似。爲什麼String.startsWith在String.endsWith佔用字符串時將Pattern作爲輸入字符串

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

這是什麼原因?作者的想法是什麼?

+0

這是一個很好的問題... 如果你有一個可選的索引與startsWith,你可以推動該模式在任何地方,而不僅僅是開始。以這種方式,endsWith可能只是一個方便的功能。 它看起來應該將startsWith重命名爲patternMatch()。 –

回答

3

Pattern的API不提供任何方式向後搜索匹配。如果endsWith採用了一個模式,它需要逐個嘗試從字符串的後面找到匹配項(最有可能在O(n^2)中)。

注意,你不能只用Pattern.allMatches,看看最後一場比賽在輸入結束時結束:

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

在這個例子中只有「一個」匹配,如果我們使用的allMatches迭代器來確定字符串是否以給定的正則表達式結尾,否則它會錯誤地失敗。

+0

我認爲正則表達式引擎能夠通過狀態機向相反方向逐步向後搜索,但事實證明唯一的正則表達式引擎能夠做到這一點是.NET中的一種。 此外,它是非常不幸的你不能簡單地擴展該模式,並用$ –

+0

來定位它。我們採用了與JS相同的正則表達式。它們速度很快,並不算太壞。對於.Net:你仍然需要創建一個新的FSM,但它應該是可行的。即使那樣你也需要改變Pattern界面。目前它比較簡單,但使用'searchBack'則難以實現。 –

相關問題