core :: Pattern :: search_index_in
self
into s
from a certain position.Return the position of the first character of the matching section. Return -1 if not found.
assert 'l'.search_index_in("hello world", 0) == 2
assert 'l'.search_index_in("hello world", 3) == 3
assert 'z'.search_index_in("hello world", 0) == -1
This method is usually faster than search_in
if what is
required is only the index.
Note: in most implementation, search_in
is implemented with this method.
# Search `self` into `s` from a certain position.
# Return the position of the first character of the matching section.
# Return -1 if not found.
#
# assert 'l'.search_index_in("hello world", 0) == 2
# assert 'l'.search_index_in("hello world", 3) == 3
# assert 'z'.search_index_in("hello world", 0) == -1
#
# This method is usually faster than `search_in` if what is
# required is only the index.
# Note: in most implementation, `search_in` is implemented with this method.
protected fun search_index_in(s: Text, from: Int): Int is abstract
lib/core/text/string_search.nit:20,2--31,67
# boyer-moore search gives the position of the first occurrence of a pattern starting at position `from`
redef fun search_index_in(s, from)
do
assert from >= 0
var n = s.length
var m = _length
var j = from
while j < n - m + 1 do
var i = m - 1 # Cursor in the pattern
while i >= 0 and _motif[i] == s[i + j] do i -= 1
if i < 0 then
return j
else
var gs = _gs[i] # Good shift
var bc = bc(s[i+j]) - m + 1 + i # Bad char
# Both are true, do move to the best
if gs > bc then
j += gs
else
j += bc
end
end
end
return -1 # found nothing
end
lib/core/text/string_search.nit:105,2--130,4
# require: not optimize_has
#
# assert "l".to_re.search_index_in("hello world", 0) == 2
# assert "el+o".to_re.search_index_in("hello world", 0) == 1
# assert "l+".to_re.search_index_in("hello world", 3) == 3
# assert "z".to_re.search_index_in("hello world", 0) == -1
redef fun search_index_in(text, from)
do
assert not optimize_has
var comp_res = compile
assert comp_res == null else "Regex compilation failed with: {comp_res.message}\n".output
var native = native
assert native != null
# Actually execute
text = text.to_s
var cstr = text.substring_from(from).to_cstring
var eflags = gather_eflags
var match = self.native_match
var res = native.regexec(cstr, 1, match, eflags)
# Found one?
if res == 0 then return match.rm_so + from
# No more match?
if res.is_nomatch then return -1
# Error, should be out of memory but we cover any possible error anyway
var error_str = get_error(res)
"Regex search failed with: {error_str}\n".output
abort
end
lib/core/re.nit:316,2--350,4
redef fun search_index_in(s, from)
do
assert from >= 0
var stop = s.length - length + 1
while from < stop do
var i = length - 1
while i >= 0 and self[i] == s[i + from] do i -= 1
# Test if we found
if i < 0 then return from
# Not found so try next one
from += 1
end
return -1
end
lib/core/text/string_search.nit:331,2--344,4