【问题标题】:Regex to check alphanumeric string in ruby正则表达式检查红宝石中的字母数字字符串
【发布时间】:2016-01-20 21:46:44
【问题描述】:

我正在尝试验证 ruby​​ 中的字符串。 任何包含空格、分数或任何特殊字符的字符串都应该无法通过验证。 有效字符串应仅包含字符 a-zA-Z0-9 我的代码看起来像。

def validate(string)
    regex ="/[^a-zA-Z0-9]$/
    if(string =~ regex)
        return "true"
    else
        return "false"
end

我收到错误: TypeError:类型不匹配:给定字符串。

谁能告诉我这样做的正确方法是什么?

【问题讨论】:

  • contain only chars a-zA-Z0-9 大概是这个/^[a-zA-Z0-9]+$/
  • @sln: ^$ 并不是你认为他们在 Ruby 正则表达式中所做的那样,你几乎总是想要 \A\z 代替。
  • 您可以将 \w 用于任何 [a-zA-Z0-9],作为快捷方式,顺便说一句。
  • @frosty: \w 也匹配 _(下划线/下划线)。

标签: ruby regex ruby-on-rails-3


【解决方案1】:

您可以只检查字符串中是否存在特殊字符。

def validate str
 chars = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a
 str.chars.detect {|ch| !chars.include?(ch)}.nil?
end

结果:

irb(main):005:0> validate "hello"
=> true
irb(main):006:0> validate "_90 "
=> false

【讨论】:

  • 我建议str.chars.all? {|ch| chars.include?(ch)}(为了更好的可读性)。此外,使用chars 作为变量名以及chars 方法可能会造成混淆。最好避免使用作为方法名称的变量名。
【解决方案2】:

如果您正在验证一行:

def validate(string)
  !string.match(/\A[a-zA-Z0-9]*\z/).nil?
end

无需每次退货。

【讨论】:

    【解决方案3】:

    类似于@rohit89:

    VALID_CHARS = [*?a..?z, *?A..?Z, *'0'..'9']
      #=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
      #    "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
      #    "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
      #    "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
      #    "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
    
    def all_valid_chars?(str)
      a = str.chars
      a == a & VALID_CHARS
    end
    
    all_valid_chars?('a9Z3')  #=> true
    all_valid_chars?('a9 Z3') #=> false
    

    【讨论】:

      【解决方案4】:

      没有正则表达式:

      def validate(str)
        str.count("^a-zA-Z0-9").zero?  # ^ means "not"
      end
      

      【讨论】:

      • 奇怪的是,除了一个答案之外,所有答案都被否决了。我今天收到了。
      • 说没有正则表达式有点奇怪,因为你传入的是正则表达式
      • @drewish 当然,它是相似的。一个有效的正则表达式是/[^a-zA-Z0-9]/(正如Joshua Pinter 的回答。
      • 不,我弄错了。我认为 count 方法只是将您传入的正则表达式的字符串版本转换为正则表达式。看着the docs,我理解你的观点,他们使用相同的字符类语法,但它不是一个完整的正则表达式。
      【解决方案5】:

      上面的答案很好,但仅供参考,您的错误消息是因为您使用双引号 " 开始您的正则表达式。您会注意到您的方法中有奇数 (5) 个双引号。

      此外,您可能希望将 true 和 false 作为值而不是引用的字符串返回。

      【讨论】:

        【解决方案6】:
        def alpha_numeric?(char)  
         
           if((char =~ /[[:alpha:]]) || (char =~ [[:digits:]]))
              true
           else
              false
           end
        
        end
        

        def alpha_numeric?(char)  
         
           if(char =~ /[[:alnum:]])
              true
           else
              false
           end
        
        end
        

        我们正在使用匹配字母和数字的正则表达式:

        上面的 [[:alpha:]] 、[[:digit:]] 和 [[:alnum:]] 是 POSIX 括号表达式,它们的优点是可以匹配其类别中的 Unicode 字符。希望这会有所帮助。

        查看以下链接以获取更多选项: Ruby: How to find out if a character is a letter or a digit?

        【讨论】:

          【解决方案7】:

          在 Ruby 2.4+ 中使用 .match?

          Ruby 2.4 引入了一种方便的布尔返回 .match? 方法。

          在你的情况下,我会这样做:

          # Checks for any characters other than letters and numbers.
          # Returns true if there are none. Returns false if there are one or more.
          #
          def valid?( string )
            !string.match?( /[^a-zA-Z0-9]/ ) # NOTE: ^ inside [] set turns it into a negated set.
          end
          

          【讨论】:

            【解决方案8】:

            类似于@steenslag 已经提到的非常有效的正则表达式方法,并且几乎同样快:

            str.tr("a-zA-Z0-9", "").length.zero?
            

            str.tr("a-zA-Z0-9", "") == 0
            

            使用tr 的一个好处是,您还可以选择使用相同的基本公式分析结果:

            str = "ABCxyz*123$"
            
            rejected_chars = str.tr("a-zA-Z0-9", "")
            #=>  *$
            
            is_valid = rejected_chars.length.zero?
            #=> false
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-05-01
              • 1970-01-01
              • 2021-11-22
              • 2010-11-29
              • 1970-01-01
              • 2022-06-23
              • 1970-01-01
              • 2014-03-30
              相关资源
              最近更新 更多