Вы получили регулярные выражения в этой теме, которые отвечают на ваш конкретный вопрос. Вы используете черный список (блокируете символы, которые вам не нужны), но действительно ли это лучше? Я вижу, вы не закрывали & или ~, и есть много других специальных символов, которые, вероятно, все еще отсутствуют.
Если вы пытаетесь заблокировать специальные символы, я бы предложил подход с использованием белого списка, согласно предложению Паблора о регулярных выражениях. Он гораздо более широкий и содержит только то, что вы хотите разрешить .... не специальные символы: только слова, подчеркивание и цифры.
Я пошел вперед и создал для вас метод, который использует подход белого списка с использованием этого регулярного выражения.
def valid_login?(str)
return true if (/^\w*$/.match(str))
return false
end
Этот метод valid_login? Возвращает значение true только в том случае, если строка содержит буквы, цифры или подчеркивание, поэтому все ваши специальные символы (плюс любые другие, которые вы пропустили, не отвечающие этим требованиям), надежно обнаружены.
Использование:
> valid_login?("testy")
true
> valid_login?("a b")
false
> valid_login?("a'")
false