Объедините несколько функций 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, но не смог.


person Raghu Srikanth Reddy    schedule 26.11.2014    source источник
comment
@EtanReisner: p в моем случае всегда равен нулю. Никогда не печатает.   -  person Raghu Srikanth Reddy    schedule 26.11.2014
comment
Этот код работает, см. eval.in/226658 и eval.in/226659   -  person Etan Reisner    schedule 26.11.2014
comment
@EtanReisner: Огромное спасибо. Разместите свой комментарий как ответ.   -  person Raghu Srikanth Reddy    schedule 26.11.2014


Ответы (2)


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

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

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

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

Вы даже можете указать точный символ, который не удался:

print("Invalid character '"..text:sub(p,p).."' at position "..p)
person Etan Reisner    schedule 26.11.2014
comment
Хотел отметить здесь, что ваши ссылки в комментариях показывают, что код почти работает. Взгляните на второй тест. привет wor%ld_t@xt напечатал недопустимый символ в 15 (@) вместо 10 (%). Однако я забыл, нужно ли удваивать %. - person Josh; 26.11.2014
comment
@ Джош Хороший улов. Да, % нужно экранировать, так как это escape-символ. Фиксированный. - person Etan Reisner; 26.11.2014

Так:

if text:match '[&"#$@%%!^*]' then 
  print 'Invalid Character'
end
person Yu Hao    schedule 26.11.2014