不区分大小写的Lua模式匹配

Nub*_*zar 11 lua case-insensitive pattern-matching

我正在Lua为运行Windows CE 6/7的移动设备编写一个grep实用程序,但是我遇到了一些实现不区分大小写的匹配模式的问题.将所有内容转换为大写(或更低)的明显解决方案由于字符类而无法正常工作.

我能想到的另一件事就是将模式本身的文字转换为大写.

这是我到目前为止所拥有的:

function toUpperPattern(instr)
    -- Check first character
    if string.find(instr, "^%l") then
        instr = string.upper(string.sub(instr, 1, 1)) .. string.sub(instr, 2)
    end
    -- Check the rest of the pattern
    while 1 do
        local a, b, str = string.find(instr, "[^%%](%l+)")
        if not a then break end
        if str then
            instr = string.sub(instr, 1, a) .. string.upper(string.sub(instr, a+1, b)) .. string.sub(instr, b + 1)
        end
    end
    return instr
end
Run Code Online (Sandbox Code Playgroud)

我不愿意承认,到目前为止需要多长时间,我仍然可以立即看到像逃脱的百分号'%%'这样的问题会出现问题

我认为这一定是一个相当普遍的问题,但我似乎无法在这个主题上找到太多.有没有更简单(或至少完整)的方法来做到这一点?我开始在这里发疯了...希望你那里的Lua大师可以开导我!

Bar*_*ers 10

尝试这样的事情:

function 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 string.format("[%s%s]", letter:lower(), letter:upper())
    end

  end)

  return p
end

print(case_insensitive_pattern("xyz = %d+ or %% end"))
Run Code Online (Sandbox Code Playgroud)

打印:

[xX][yY][zZ] = %d+ [oO][rR] %% [eE][nN][dD]