如何在Lua中删除字符串中的某些特殊字符?

在Lua中,如何从字符串中删除特定的特殊字符?

例如,输入姓名将是:

  • L@)iAm PAGE 更改为 Liam Page
  • José Luis 更改为 Jose Luis
  • JACK O'NIEL 更改为 Jack O'Niel

我目前有

firstName = ipFirstName:gsub('[%p%c%s]', '')
lastName = ipLastName:gsub('[%p%c%s]', '')

但它太广泛了。

点赞
用户6632736
用户6632736

下面是一个简单的函数来清理姓名,可以达到一定的程度:

local function sanitizeName (name)
    local accented = {
        ['ß'] = 'ss'
      , ['à'] = 'a', ['á'] = 'a', ['â'] = 'a', ['ã'] = 'a', ['å'] = 'a'
      , ['ä'] = 'ae', ['æ'] = 'ae'
      , ['ç'] = 'c'
      , ['è'] = 'e', ['é'] = 'e', ['ê'] = 'e', ['ë'] = 'e'
      , ['ì'] = 'i', ['í'] = 'i', ['î'] = 'i', ['ï'] = 'i'
      , ['ð'] = 'dh'
      , ['ñ'] = 'n'
      , ['ò'] = 'o', ['ó'] = 'o', ['ô'] = 'o', ['õ'] = 'o', ['ø'] = 'o'
      , ['ö'] = 'oe'
      , ['ù'] = 'u', ['ú'] = 'u', ['û'] = 'u'
      , ['ü'] = 'ue'
      , ['ý'] = 'y', ['ÿ'] = 'y'
      , ['þ'] = 'th'
    }
    local sanitized = name
        :lower()                        -- 将所有字符转换为小写。
        :gsub ('%s+', ' ')              -- 标准化空格。
    -- 替换一些非 ASCII 字符:
    for fancy, plain in pairs (accented) do
        sanitized = sanitized:gsub (fancy, plain)
    end
    return sanitized
        :gsub ("[^%a ']", '')           -- 删除除 ASCII、空格和撇号以外的所有内容。
        :gsub ('^%a', string.upper)     -- 大写第一个名字的第一个字母。
        :gsub ("[ ']%a", string.upper)  -- 大写其他名字的第一个字母。
end

for _, name in ipairs {'L@)iAm PAGE', 'José Luis', "JACK O'NIEL"} do
    print (name, sanitizeName (name))
end

然而,为了正确处理 Unicode 字符,请参阅 此页面。另请注意,关于个人名称的大多数假设都是错误的。

2021-01-14 08:08:44