Ecco una soluzione che utilizza l'acquisizione della posizione LPeg.
local lpeg = require "lpeg"
local Cp, P = lpeg.Cp, lpeg.P
local lpegmatch = lpeg.match
local cache = { }
local find_last = function (str, substr)
if not (str and substr)
or str == "" or substr == ""
then
return nil
end
local pat = cache [substr]
if not pat then
local p_substr = P (substr)
local last = Cp() * p_substr * Cp() * (1 - p_substr)^0 * -1
pat = (1 - last)^0 * last
cache [substr] = pat
end
return lpegmatch (pat, str)
end
find_last()
trova l'ultima occorrenza di substr nella stringa str, dove substr può essere una stringa di qualsiasi lunghezza. Il primo valore di ritorno è la posizione del primo carattere di substr in str, il secondo valore di ritorno è la posizione del primo carattere seguente substr (cioè pari alla lunghezza della partita più la primo valore di ritorno).
Usage:
local tests = {
A = [[fooA]], --> 4, 5
[""] = [[foo]], --> nil
FOO = [[]], --> nil
K = [[foo]], --> nil
X = [[X foo X bar X baz]], --> 13, 14
XX = [[foo XX X XY bar XX baz X]], --> 17, 19
Y = [[YYYYYYYYYYYYYYYYYY]], --> 18, 19
ZZZ = [[ZZZZZZZZZZZZZZZZZZ]], --> 14, 17
--- Accepts patterns as well!
[P"X" * lpeg.R"09"^1] = [[fooX42barXxbazX]], --> 4, 7
}
for substr, str in next, tests do
print (">>", substr, str, "->", find_last (str, substr))
end
fonte
2013-12-09 01:04:42
Che problema stai cercando di risolvere esattamente? – lhf
Penso che il modo più semplice sia usare 'string.find'' ('my.string.here.'): Find ("%. [^.] - $") '. ma è necessario sfuggire ai caratteri speciali (ad esempio '.',' * ',' + 'ecc.). Anche in Lua il risultato dovrebbe essere 15. – moteus
@moteus bel suggerimento, ma volevo una soluzione comune (trovando anche l'indice per i numeri, per esempio) – Kosmetika