Đây là giải pháp sử dụng tính năng chụp vị trí của 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()
thấy sự xuất hiện cuối cùng của substr trong chuỗi str, nơi substr có thể là một chuỗi của bất kỳ chiều dài. Giá trị trả về đầu tiên là vị trí của ký tự đầu tiên của substr trong str, giá trị trả về thứ hai là vị trí của ký tự đầu tiên sau substr (tức là nó tương đương với chiều dài của trận đấu cộng với giá trị trả về đầu tiên).
Cách sử dụng:
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
Nguồn
2013-12-09 01:04:42
Bạn đang cố giải quyết vấn đề gì? – lhf
Tôi nghĩ cách đơn giản nhất là sử dụng 'string.find'' ('my.string.here.'): Find ("%. [^.] - $") '. nhưng bạn cần thoát khỏi các ký tự đặc biệt (ví dụ: '.',' * ',' + 'v.v.). Ngoài ra trong kết quả Lua nên được 15. – moteus
@moteus gợi ý tốt đẹp, nhưng tôi muốn giải pháp phổ biến (tìm chỉ số cho các con số là tốt, ví dụ) – Kosmetika