Lua:字符类型

我需要一个函数

function getCharType(c)
  local i = string.byte(c) -- 仅适用于 1 字节字符
  if (i > 48) and (i < 57) then return 1 end
  if (i > 97) and (i < 122) then return 2 end
  return 0
end

它应该返回

2 - 如果c是一个字母
1 - 如果c是一个数字
0 - 如果c是一个符号(其他任何符号)

c本身将已经是小写字符:charType = getCharType(string.lower(Character))。如果可能有Unicode字符,那就太好了。

使用以上内容,getCharType("ö")为0。

点赞
用户6834680
用户6834680
只能使用 ASCII 字符(不支持 Unicode)
function getCharType(c)
   return #c:rep(3):match(".%w?%a?")-1
end
2018-10-01 11:09:59
用户9383219
用户9383219

为了确定非ASCII字符是大写字母、小写字母或数字,您需要Unicode数据。Module:Unicode data在维基百科上有一个函数,它使用了Module:Unicode data/category(Unicode字符的通用类别数据)。

以下是从Module:Unicode data中lookup_category函数的改编。我没有包括Unicode数据(Module:Unicode data/category),您需要从上面的链接中复制它。

local category_data -- 将此变量设置为Module:Unicode data/category中的表格
local floor = math.floor
local function binary_range_search(code_point, ranges)
    local low, mid, high
    low, high = 1, #ranges
    while low <= high do
        mid = floor((low + high) / 2)
        local range = ranges[mid]
        if code_point < range[1] then
            high = mid - 1
        elseif code_point <= range[2] then
            return range
        else
            low = mid + 1
        end
    end
    return nil
end

function get_category(code_point)
    if category_data.singles[code_point] then
        return category_data.singles[code_point]
    else
        local range = binary_range_search(code_point, category_data.ranges)
        return range and range[3] or "Cn"
    end
end

函数get_category接受一个代码点(数字)并返回通用类别的名称。我猜您感兴趣的类别是Nd(数字、十进制数字)和以L开头的类别(字母)。

您需要一个函数将字符转换为代码点。如果文件使用UTF-8编码并且您使用Lua 5.3,则可以使用utf8.codepoint函数:get_category(utf8.codepoint('ö'))将得到'Ll'。您可以将类别代码转换为上面函数使用的数字值:function category_to_number(category) if category == "Nd" then return 1 elseif category:sub(1, 1) == "L" then return 2 else return 0 end end

2018-10-01 22:16:20