CARVIEW |
Select Language
HTTP/2 200
date: Thu, 24 Jul 2025 07:41:52 GMT
content-type: text/html; charset=utf-8
vary: X-PJAX, X-PJAX-Container, Turbo-Visit, Turbo-Frame, X-Requested-With,Accept-Encoding, Accept, X-Requested-With
etag: W/"fcb3fa8ca1b84ea744b5a5997d26b9f8"
cache-control: max-age=0, private, must-revalidate
strict-transport-security: max-age=31536000; includeSubdomains; preload
x-frame-options: deny
x-content-type-options: nosniff
x-xss-protection: 0
referrer-policy: origin-when-cross-origin, strict-origin-when-cross-origin
content-security-policy: default-src 'none'; base-uri 'self'; child-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/; connect-src 'self' uploads.github.com www.githubstatus.com collector.github.com raw.githubusercontent.com api.github.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com *.rel.tunnels.api.visualstudio.com wss://*.rel.tunnels.api.visualstudio.com objects-origin.githubusercontent.com copilot-proxy.githubusercontent.com proxy.individual.githubcopilot.com proxy.business.githubcopilot.com proxy.enterprise.githubcopilot.com *.actions.githubusercontent.com wss://*.actions.githubusercontent.com productionresultssa0.blob.core.windows.net/ productionresultssa1.blob.core.windows.net/ productionresultssa2.blob.core.windows.net/ productionresultssa3.blob.core.windows.net/ productionresultssa4.blob.core.windows.net/ productionresultssa5.blob.core.windows.net/ productionresultssa6.blob.core.windows.net/ productionresultssa7.blob.core.windows.net/ productionresultssa8.blob.core.windows.net/ productionresultssa9.blob.core.windows.net/ productionresultssa10.blob.core.windows.net/ productionresultssa11.blob.core.windows.net/ productionresultssa12.blob.core.windows.net/ productionresultssa13.blob.core.windows.net/ productionresultssa14.blob.core.windows.net/ productionresultssa15.blob.core.windows.net/ productionresultssa16.blob.core.windows.net/ productionresultssa17.blob.core.windows.net/ productionresultssa18.blob.core.windows.net/ productionresultssa19.blob.core.windows.net/ github-production-repository-image-32fea6.s3.amazonaws.com github-production-release-asset-2e65be.s3.amazonaws.com insights.github.com wss://alive.github.com api.githubcopilot.com api.individual.githubcopilot.com api.business.githubcopilot.com api.enterprise.githubcopilot.com; font-src github.githubassets.com; form-action 'self' github.com gist.github.com copilot-workspace.githubnext.com objects-origin.githubusercontent.com; frame-ancestors 'none'; frame-src viewscreen.githubusercontent.com notebooks.githubusercontent.com; img-src 'self' data: blob: github.githubassets.com media.githubusercontent.com camo.githubusercontent.com identicons.github.com avatars.githubusercontent.com private-avatars.githubusercontent.com github-cloud.s3.amazonaws.com objects.githubusercontent.com release-assets.githubusercontent.com secured-user-images.githubusercontent.com/ user-images.githubusercontent.com/ private-user-images.githubusercontent.com opengraph.githubassets.com copilotprodattachments.blob.core.windows.net/github-production-copilot-attachments/ github-production-user-asset-6210df.s3.amazonaws.com customer-stories-feed.github.com spotlights-feed.github.com objects-origin.githubusercontent.com *.githubusercontent.com; manifest-src 'self'; media-src github.com user-images.githubusercontent.com/ secured-user-images.githubusercontent.com/ private-user-images.githubusercontent.com github-production-user-asset-6210df.s3.amazonaws.com gist.github.com; script-src github.githubassets.com; style-src 'unsafe-inline' github.githubassets.com; upgrade-insecure-requests; worker-src github.githubassets.com github.com/assets-cdn/worker/ github.com/assets/ gist.github.com/assets-cdn/worker/
server: github.com
content-encoding: gzip
accept-ranges: bytes
set-cookie: _gh_sess=OcG%2Bd3uAAggJ068a1E4oEr%2BFdSaXx%2BuvCvlHnoSyjRB1DUWvCDQrtQS7ivtRA91tcSsQZWVPV50SdLYz%2FENWw18gLLIazmK%2FM1NnB5II9Nlf6%2BZIwyHDD3fJk%2BRKLYeZHLV1OnibgBEOoI3yKdidM6BjrngZtIzKkNRaZG8nVw80R2NnfbiNEDzBtiKIBc7u3%2BwCE8H9rGDspR0boWnItTueNPxFKkUkiyNwEqR5cwrNPFqlGGJkZKro8R8e8Ym%2FEDJN284uI30ROBr2t8Cp9g%3D%3D--M3wNvLfVJRncWHnI--qhe6igWjcHZ72ycDItNf5g%3D%3D; Path=/; HttpOnly; Secure; SameSite=Lax
set-cookie: _octo=GH1.1.2078664719.1753342912; Path=/; Domain=github.com; Expires=Fri, 24 Jul 2026 07:41:52 GMT; Secure; SameSite=Lax
set-cookie: logged_in=no; Path=/; Domain=github.com; Expires=Fri, 24 Jul 2026 07:41:52 GMT; HttpOnly; Secure; SameSite=Lax
x-github-request-id: B5FE:0A46:26F96F:2B6C5C:6881E3C0
A clean implementation of the aho-corasick algorithm taking full advantage of Lua's __index metamethod. · GitHub
Show Gist options
Save Validark/d493cfd1b3425c2e3073f5ccd08fbeb9 to your computer and use it in GitHub Desktop.
{{ message }}
Instantly share code, notes, and snippets.
Created
July 18, 2021 12:31
-
Star
3
(3)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save Validark/d493cfd1b3425c2e3073f5ccd08fbeb9 to your computer and use it in GitHub Desktop.
A clean implementation of the aho-corasick algorithm taking full advantage of Lua's __index metamethod.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- We can re-use metatables where possible | |
local lookupCache = { | |
__index = function(self, i) | |
local v = { __index = i } | |
self[i] = v | |
return v | |
end | |
} | |
local function use_aho_corasick(automaton, str) | |
local found = {} | |
local state = automaton | |
for i = 1, string.len(str) do | |
state = state[string.lower(string.sub(str, i, i))] or automaton | |
for _, capture in ipairs(state.captures) do | |
table.insert(found, { i - capture + 1, i }) | |
end | |
end | |
return found | |
end | |
local automaton_mt = { __call = use_aho_corasick } | |
-- given a dictionary Array<string> | |
-- output a DFA with metatable magic | |
local function aho_corasick(dictionary) | |
-- captures: Array<numbers> representing the length of matched strings | |
local automaton = { captures = {} } | |
-- construct a basic Trie for the dictionary | |
for _, word in ipairs(dictionary) do | |
local cur = automaton | |
for char in string.gmatch(word, ".") do | |
local next = cur[char] | |
if next == nil then | |
next = {} | |
cur[char] = next | |
end | |
cur = next | |
end | |
cur.captures = cur.captures or {} | |
table.insert(cur.captures, string.len(word)) | |
end | |
-- Link each node to the longest suffix in its path | |
-- Do a BFS, linking each level with its runs | |
-- (BFS allows us to use our links as we go!) | |
local pointers = setmetatable({}, lookupCache) | |
local queue = { { {}, automaton } } | |
for _, data in ipairs(queue) do | |
for char, node in pairs(data[2]) do | |
if char ~= "captures" then | |
local state = data[1][char] or automaton | |
if #state.captures > 0 then | |
if node.captures == nil then node.captures = {} end | |
table.move(state.captures, 1, #state.captures, #node.captures + 1, node.captures) | |
end | |
table.insert(queue, { state, setmetatable(node, pointers[state]) }) | |
end | |
end | |
end | |
return setmetatable(automaton, automaton_mt) | |
end | |
do -- a little demo | |
local automata = aho_corasick { "try", "to", "find", "all", "these", "words" } | |
local input = "Let's see if you can find any matching words in this sentence" | |
local captures = automata(input) | |
for _, capture in ipairs(captures) do | |
print(capture[1], string.sub(input, capture[1], capture[2])) | |
end | |
end | |
return aho_corasick |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
You can’t perform that action at this time.