2014-11-26 2 views
2

У меня есть функция, где мне нужно проверить специальные символы и разбить ее, если найду ее.Объединить несколько функций string.match в одну строку

Вот что я пробовал.

local text = "h!ello\"wor%[email protected]^*sp&ki#$te" 

if (string.match(text, "&") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "\"") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "#") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "$") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "@") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "%%") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "!") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "^") ~= nil) then 
    print("Invalid Character \n") 
end 

if (string.match(text, "*") ~= nil) then 
    print("Invalid Character \n") 
end 

Я могу успешно это сделать, но я хочу, чтобы все было в одной строке. Прошел через книгу программирования Lua, но не смог добраться.

+3

'локальный р = строка .find (текст, '[& "# $ @%!^*]'), если p затем напечатать (« Недопустимый символ, найденный в «..p»), end' –

+0

@EtanReisner: p всегда в моем случае nil. никогда не печатает. –

+0

Этот код работает см. https://eval.in/226658 и https://eval.in/226659 –

ответ

3

Чтобы соответствовать на одном из набора символов, нужно использовать [set]нотации 1.

Так следующие должны делать то, что вы хотите, и обеспечить немного лучшую индикацию отказа:

local p = string.find(text, '[&"#[email protected]%%!^*]'); 

if p then 
    print("Invalid character found at "..p) 
end 

Можно даже включить точный характер, что не удалось:

print("Invalid character '"..text:sub(p,p).."' at position "..p) 
+0

Хотел бы отметить здесь, что ваши ссылки в комментариях показывают, что код работает почти. Взгляните на второй тест. «hello wor% ld_t @ xt» напечатал недопустимый символ в 15 (@) вместо 10 (%). Я забываю, что% нужно удвоить. – Josh

+0

@ Josh Хороший улов. Да, '%' нужно экранировать, поскольку это символ escape. Исправлена. –

 Смежные вопросы

  • Нет связанных вопросов^_^