【问题标题】:Regex Ruby Confusion正则表达式 Ruby 混淆
【发布时间】:2023-03-08 12:05:01
【问题描述】:

我目前正在构建一个任意 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

此外,我尝试了正则表达式 /[az]+/ 只是为了检查它是否是我的正则表达式,但它似乎不太好,因为当我使用正则表达式 /[az]+/ 键入 33 时,它也可以正常工作美好的?我在这里做错了什么哈哈。

【问题讨论】:

  • 你需要一个/ 在字符串开始之前,所以这是一个永远不会匹配任何字符串的模式。使用name_pattern = /\A[^0-9`!@#$%^&*+_=]+\z/
  • 它在不应该的时候运行良好 -- 这不是描述问题的好方法。 “运行良好”是什么意思?

标签: regex ruby io


【解决方案1】:

问题是您的正则表达式在开头和结尾包含正斜杠。

此代码为“一个或多个小写字母”定义了一个正则表达式:

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

您的代码混淆了这两种语法,在正则表达式的开头和结尾添加了斜杠。

【讨论】:

    【解决方案2】:

    您需要在字符串开头 (\A) 之前使用 /,因此您的 /\A[^0-9`!@#\$%\^&*+_=]+\z/ pattern 是一个永远不会匹配任何字符串的模式。

    使用

    name_pattern = /\A[^0-9`!@#$%^&*+_=]+\z/
    

    或者,如果您更喜欢 Regexp.new 表示法,

    name_pattern = Regexp.new('\A[^0-9`!@#$%^&*+_=]+\z')
    

    此外,字符类中的$ 永远不需要转义,[$] 始终匹配文字 $ 字符。

    字符类中的^ 字符只有在它是类中的第一个字符时才需要转义。在这里,它不是第一个,所以没有必要逃避它。

    【讨论】:

      猜你喜欢
      • 2018-07-05
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      相关资源
      最近更新 更多