提问人:Eliot Shedlock 提问时间:10/12/2021 更新时间:10/12/2021 访问量:39
正则表达式 Ruby 混淆
Regex Ruby Confusion
问:
我目前正在构建一个任意的 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
此外,我尝试了正则表达式 /[a-z]+/ 只是为了检查它是否是我的正则表达式,似乎情况并非如此,因为当我使用正则表达式 /[a-z]+/ 键入 33 时,它也可以正常工作?我在这里做错了什么,哈哈。
答:
0赞
Wiktor Stribiżew
10/12/2021
#1
您需要字符串 () 的 before 开始,因此您的模式是永远不会与任何字符串匹配的模式。/
\A
/\A[^0-9`!@#\$%\^&*+_=]+\z/
用
name_pattern = /\A[^0-9`!@#$%^&*+_=]+\z/
或者,如果您更喜欢符号,Regexp.new
name_pattern = Regexp.new('\A[^0-9`!@#$%^&*+_=]+\z')
此外,在字符类中,从不需要转义,始终与文字字符匹配。$
[$]
$
字符类中的字符仅当它是类中的第一个字符时才需要转义。在这里,它不是第一个,所以没有必要逃避它。^
2赞
Tom Lord
10/12/2021
#2
问题是您的正则表达式在开头和结尾都包含一个正斜杠。
此代码为“一个或多个小写字母”定义正则表达式:
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')
您的代码通过在正则表达式的开头和结尾添加文字斜杠来混淆这两种语法。
评论
/
name_pattern = /\A[^0-9`!@#$%^&*+_=]+\z/