Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 四位数字系列的正则表达式,每一位最大为100_Ruby_Regex - Fatal编程技术网

Ruby 四位数字系列的正则表达式,每一位最大为100

Ruby 四位数字系列的正则表达式,每一位最大为100,ruby,regex,Ruby,Regex,我正在尝试编写一个正则表达式来验证字符串,并且只接受由四个逗号分隔的数字组成的序列,每个数字最多为100。类似这样的东西是有效的: 20,30,40,50 这些是无效的: 120,0,20,0 20,30,40,ss invalid_string 有什么想法吗 它们用于CMYK颜色。我们只需要将它们存储在这里,而不是使用它们。数字范围和子例程 在Ruby 2+中,对于紧凑型正则表达式,请使用以下命令: ^([0-9]|[1-9][0-9]|100)(?:,\g<1>){3}$

我正在尝试编写一个正则表达式来验证字符串,并且只接受由四个逗号分隔的数字组成的序列,每个数字最多为
100
。类似这样的东西是有效的:

20,30,40,50
这些是无效的:

120,0,20,0
20,30,40,ss
invalid_string
有什么想法吗


它们用于CMYK颜色。我们只需要将它们存储在这里,而不是使用它们。

数字范围和子例程

在Ruby 2+中,对于紧凑型正则表达式,请使用以下命令:

^([0-9]|[1-9][0-9]|100)(?:,\g<1>){3}$
^([0-9]|[1-9][0-9]| 100)(?:,\g){3}$
解释

  • ^
    锚定声明我们位于字符串的开头
  • ([0-9]|[1-9][0-9]| 100)
    周围的括号匹配0到100之间的数字,并定义子例程| 1
  • (?:,\g)
    匹配一个逗号和子例程1定义的表达式
  • {3}
    量词重复这三次
  • $
    锚点断言我们在字符串的末尾

    • 我可以省去使用正则表达式解决数字相关问题的麻烦。此外,验证消息看起来也很糟糕,因此最好自己制作:

      validate :that_string_has_only_4_numbers_upto_100
      
      def that_string_has_only_4_numbers_upto_100
        errors.add(:str, 'is not valid.') unless str.split(/,/).all? { |n| 1..100 === n.to_i }
      end
      
      除非你是像@zx81:p这样的regex绝地大师

      ^(?:\d{1,2},){3}\d{1,2}$
      

      试试这个

      哇。这个解释给我留下了深刻的印象。哇,这么简单,但我不会猜到+1子例程是一项很棒的功能,许多引擎都不支持它。但Ruby 2+有它的功能。:)你也可以给它们命名。像
      (?[a-z]+){0}\g
      @nicooga谢谢你的支持。是的,没错,你可以说出他们的名字。:)将另一个标记为已接受,因为它在正则表达式中,但无论如何还是要感谢。建议至少在代码中添加一些注释。