正则表达式 Ruby 混淆

Regex Ruby Confusion

提问人:Eliot Shedlock 提问时间:10/12/2021 更新时间:10/12/2021 访问量:39

问:

我目前正在构建一个任意的 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 时,它也可以正常工作?我在这里做错了什么,哈哈。

正则表达式 Ruby IO

评论

0赞 Wiktor Stribiżew 10/12/2021
您需要字符串的 before start,因此这是一个永远不会与任何字符串匹配的模式。用/name_pattern = /\A[^0-9`!@#$%^&*+_=]+\z/
0赞 Tom Lord 10/12/2021
当它不应该运行时,它运行良好 - 这不是描述问题的好方法。“it runs fine” 是什么意思?

答:

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')

您的代码通过在正则表达式的开头和结尾添加文字斜杠来混淆这两种语法。