最近在看resty.waf包,看到一个lua实现的比较高效的字符串非正则匹配代码,相比string.find在100万次简单字符串匹配快一倍,具体实现代码如下:
function _M.str_match(input, pattern)
if (type(input) == ‘table’) then
for _, v in ipairs(input) do
local match, value = _M.str_match(v, pattern)
if (match) then
return match, value
end
end
else
local n, m = #input, #pattern
if m > n then
return
end
local char = {}
for k = 0, 255 do char[k] = m end
//这边是关键
for k = 1, m-1 do char[pattern:sub(k, k):byte()] = m - k end
local k = m
while k <= n do
local i, j = k, m
while j >= 1 and input:sub(i, i) == pattern:sub(j, j) do
i, j = i - 1, j - 1
end
if j == 0 then
return true, input
end
//这边是关键
k = k + char[input:sub(k, k):byte()]
end
return false, nil
end
return false, nil
end
其他语言也可以实现一套这个的string.find的逻辑