X-Git-Url: http://nitlanguage.org diff --git a/lib/standard/string_search.nit b/lib/standard/string_search.nit index fcf14c7..9965bb1 100644 --- a/lib/standard/string_search.nit +++ b/lib/standard/string_search.nit @@ -85,6 +85,7 @@ interface Pattern return res end + # Is `self` in `s`? protected fun is_in(s: Text): Bool do return search_index_in(s, 0) != -1 end @@ -204,7 +205,6 @@ class BM_Pattern private fun compute_gs do - var x = _motif var m = _length var suff = suffixes var i = 0 @@ -327,6 +327,37 @@ redef class Text # assert "I say hello to the world!".search_from("hello",7) == null fun search_from(p: Pattern, from: Int): nullable Match do return p.search_in(self, from) + # Search the last occurence of the text `t`. + # + # assert "bob".search_last("b").from == 2 + # assert "bob".search_last("bo").from == 0 + # assert "bob".search_last("ob").from == 1 + # assert "bobob".search_last("ob").from == 3 + # assert "bobbob".search_last("bb").from == 2 + # assert "bobbob".search_last("bob").from == 3 + # assert "bob".search_last("z") == null + # assert "".search_last("b") == null + fun search_last(t: Text): nullable Match do + return search_last_up_to(t, length) + end + + # Search the last occurence of the text `t` before `up_to`. + # + # assert "bobbob".search_last_up_to("b", 3).from == 2 + # assert "bobbob".search_last_up_to("b", 6).from == 5 + # assert "bobbob".search_last_up_to("b", 0) == null + fun search_last_up_to(t: Text, up_to: Int): nullable Match do + var i = up_to - t.length + + while i >= 0 do + if substring(i, t.length) == t then + return new Match(self.to_s, i, t.length) + end + i -= 1 + end + return null + end + # Search all occurrences of p into self. # # var a = new Array[Int]