From ab1eb4c0375b8cff34988806a78b07e1da4f1925 Mon Sep 17 00:00:00 2001 From: rewanth Date: Thu, 8 Jun 2017 08:20:19 +0000 Subject: [PATCH] Adds case insensitive pattern generator function. Closes #853 --- nselib/stdnse.lua | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/nselib/stdnse.lua b/nselib/stdnse.lua index 68d97ec4d..7100370fd 100644 --- a/nselib/stdnse.lua +++ b/nselib/stdnse.lua @@ -1445,4 +1445,29 @@ function keys(t) return ret end +-- Returns the case insensitive pattern of given parameter +-- Useful while doing case insensitive pattern match using string library. +-- https://stackoverflow.com/questions/11401890/case-insensitive-lua-pattern-matching/11402486#11402486 +-- +-- Ex: generate_case_insensitive_pattern("user") = "[uU][sS][eE][rR]" +-- +-- @param pattern The string +-- @return A case insensitive patterned string +function generate_case_insensitive_pattern(pattern) + -- Find an optional '%' (group 1) followed by any character (group 2) + local p = pattern:gsub("(%%?)(.)", function(percent, letter) + + if percent ~= "" or not letter:match("%a") then + -- If the '%' matched, or `letter` is not a letter, return "as is" + return percent .. letter + else + -- Else, return a case-insensitive character class of the matched letter + return format("[%s%s]", letter:lower(), letter:upper()) + end + + end) + + return p +end + return _ENV;