我目前正在构建一个任意的ruby程序,但我的名字验证通过ruby(尚未使用rails)来验证始终不工作,因为当我输入纯数字时,它运行良好,当它不应该。
def user_input
puts 'What is your name?'
user_name = gets.chomp
name_pattern = Regexp.new('/A[^0-9`!@#$%^&*+_=]+z/')
while user_name =~ name_pattern
puts 'please enter a real name'
user_name = gets.chomp
end
user_name
end
def main
user_name = user_input
puts "n"
puts user_name.to_s
end
此外,我还尝试了regex/[a-z]+/只是为了检查它是否是我的regex,它似乎不是那么好,因为当我用regex/[a-z]+/输入33时,它也工作得很好?我哪里做错了,哈哈。
问题是你的regex在开头和结尾包含一个正斜杠。
下面的代码为"一个或多个小写字母"定义了一个正则表达式:
name_pattern = /[a-z]+/
# OR
name_pattern = Regex.new('[a-z]+')
这段代码定义了一个正则表达式,整个字符串只能由一个或多个小写字符组成:
name_pattern = /A[a-z]+z/
# OR
name_pattern = Regex.new('A[a-z]+z')
这段代码为"定义了一个正则表达式;整个字符串只能由不是的字符组成数字,非特定符号";
name_pattern = /A[^0-9`!@#$%^&*+_=]z/
# OR
name_pattern = Regex.new('A[^0-9`!@#$%^&*+_=]z')
你的代码混淆了这两种语法,通过在regex的开始和结束添加文字斜杠。
您需要在字符串(A
)开始之前使用/
,因此您的/A[^0-9`!@#$%^&*+_=]+z/
模式是一个从不匹配任何字符串的模式。
使用
name_pattern = /A[^0-9`!@#$%^&*+_=]+z/
或者,如果您喜欢Regexp.new
符号,
name_pattern = Regexp.new('A[^0-9`!@#$%^&*+_=]+z')
同样,字符类中的$
不需要转义,[$]
总是匹配$
字符。
字符类中的^
字符只有当它是该类中的第一个字符时才需要转义。这里,它不是第一个,所以不需要转义。