Ruby非Rails环境下正则实现姓名校验功能失效问题求助
问题1:正则实例化方式错误
Ruby提供两种正则创建方式,混用会导致匹配规则完全偏离预期:
- 正则字面量写法:直接写
/\A[^0-9!@#$%^&*+_=]+\z/`,不需要额外包裹引号 Regexp.new构造写法:传入的规则字符串不需要加前后的斜杠,正确写法为Regexp.new('\A[^0-9!@#$%^&*+_=]+\z')`
原有代码给Regexp.new传入了带前后斜杠的字符串,相当于强制要求匹配内容的首尾必须带斜杠,正常输入的姓名不可能满足该规则,因此正则永远返回匹配失败。
问题2:校验逻辑写反
正则规则定义的是合法姓名的匹配条件,原有代码while user_name =~ name_pattern的逻辑为「输入符合姓名规则时进入循环要求重新输入」,和需求完全相反。正确逻辑应为输入不符合规则时进入循环重输。
问题3:简化正则测试时依然存在上述问题
测试简化版正则/[a-z]+/时如果仍使用Regexp.new('/[a-z]+/')的错误写法,会持续触发第一个问题。即便修正实例化写法,纯数字33本身也无法匹配/[a-z]+/的规则,结合写反的逻辑,匹配失败会直接跳过循环,因此输入33依然可以通过校验。
修正后代码
def user_input puts 'What is your name?' user_name = gets.chomp # 直接使用正则字面量,无需通过Regexp.new构造 name_pattern = /\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 main
补充说明:原有正则中的&是HTML转义字符,在Ruby正则中无需转义,直接保留&即可正常匹配。
内容的提问来源于stack exchange,提问作者Eliot Shedlock
相关产品推荐
相关产品推荐

