Шаблоны Lua и Unicode

Что было бы лучшим способом найти слово, такое как Hi, или имя, в основном похожее на dön, с этим специальным символом в нем с помощью шаблона. Они будут необязательными, поэтому, очевидно, следует использовать '?' но я не знаю, какой контрольный код использовать, чтобы найти их.

Я в основном хочу убедиться, что я получаю слова с возможными символами юникода в них, но ничего больше. Так что dön будет в порядке, но никаких других специальных символов или чисел и тому подобных скобок.


person TULOA    schedule 09.12.2014    source источник
comment
Поддержка Unicode в Lua (5.2 или ранее) в целом довольно ограничена. Опубликуйте минимальный, полный и проверяемый пример того, что именно вы хотите решить, возможно, есть простой способ решить это, возможно нет.   -  person Yu Hao    schedule 09.12.2014
comment
Хорошо, я могу привести упрощенный пример: мне нужен шаблон lua, который может возвращать слова со специальными символами в них. НО они не должны иметь специальные символы. Если это возможно, как бы я это сделал?   -  person TULOA    schedule 10.12.2014


Ответы (1)


Согласно руководству Lua по Unicode, "средства сопоставления шаблонов Lua работают побайтно. В общем, это не будет работать для сопоставления шаблонов Unicode, хотя некоторые вещи будут работать так, как вы хотите». Это означает, что лучший вариант, вероятно, состоит в том, чтобы перебрать каждый символ и определить, является ли это допустимой буквой. Чтобы перебрать каждый символ Юникода в строке:

for character in string.gmatch(myString, "([%z\1-\127\194-\244][\128-\191]*)") do
    -- Do something with the character
end

Обратите внимание, что этот метод не будет работать, если myString не является допустимым юникодом. Чтобы проверить, является ли символ тем, который вам нужен, вероятно, лучше просто иметь список всех символов, которые вам не нужны в ваших строках, а затем исключить их:

local notAllowed = ":()[]{}+_-=\|`~,.<>/?!@#$%^&*"
local isValid = true

for character in string.gmatch(myString, "([%z\1-\127\194-\244][\128-\191]*)") do
    if notAllowed:find(character) then
        isValid = false
        break
    end
end

Надеюсь, это помогло.

person GravityScore    schedule 10.12.2014