使用ruby生成一系列特殊字符

时间:2015-11-13 11:25:42

标签: ruby range

我现在对ruby很新,但我来自PHP背景,必须说我喜欢做ruby,很多。这是一个非常好的语言,社区是严格但有帮助的。

今天我正在查看stackoverflow并检查我的answers之一问题以使用PHP生成随机字符串。我实际上已经写了一个脚本,所以我想,为什么不分享它!

此脚本有一些修饰符,允许您选择是否要包含以下集合

  1. 小写字母a-z
  2. [1] +大写字母a-z
  3. [1,2] +数字
  4. [1,2,3] +特殊字符
  5. [1,2,3,4] +一些疯狂的巫毒角色
  6. 因此,在这个PHP脚本中,我将每个集合物理地键入一个数组,例如:

    $charSubSets = array(
        'abcdefghijklmnopqrstuvwxyz',
        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        '0123456789',
        '!@#$%^&*()_+{}|:">?<[]\\\';,.`~',
        'µñ©æáßðøäåé®þüúíóö'
    );
    

    这基本上是我能够在那里定义复杂性的方式。

    现在这看起来还不错,即使在代码中,但ruby有ranges并且范围对我来说是一个新的和有光泽的东西所以我想在今天晚些时候构建一个随机字符串生成器只是为了获得更多的经验用它。

    现在我的问题是,我知道您可以使用以下范围执行以下操作:

    1. 'a'..'z'
    2. 'A'..'Z'
    3. 0..9
    4. 等等。但我在想,你能用特殊字符制作一个范围吗?如,特殊字符?如果是可能的,你是否也可以为疯狂的伏都魔做同样的事情?

      我问的原因是因为docs中没有任何例子,或者SO上有任何解释这一点的例子。

2 个答案:

答案 0 :(得分:4)

  1. 查看从{Enumerable获得的Range#to_a。请注意,在docs的左侧,它表示Range包含Enumerable,这意味着可以在Ranges上调用Enumerable中的方法。如果在类中找不到方法,请查看文档所说的包含的模块,然后单击指向所包含模块的链接。

  2. 查看Array#shuffle

  3. 查看Array#join

  4. 查看Array#[],它将采用范围作为下标,因此您可以获取一系列随机字符。

  5. 两点范围包括结尾。三点范围不包括结尾:

    p (1...5).to_a #=> [1, 2, 3, 4]

  6. 全部放在一起:

    chars = (0..9).to_a + ('A'..'z').to_a + ('!'..'?').to_a
    
    10.times do 
      puts chars.shuffle[0..5].join
    end
    
    --output:--
    I(m,E.
    %_;i(3
    rb=_ef
    kJrA9n
    YA`e.K
    89qCji
    Ba1x3D
    acp)=8
    2paq3I
    U0>Znm
    

    (莎士比亚最终将出现在那里。)

答案 1 :(得分:3)

是的 - 这肯定是可能的。 启动你的控制台,例如irbpry

  1. 为特殊字符
    ('!'..'?').to_a # => ["!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?"]

  2. 代表'voodooh'字符
    ('µ'..'ö').to_a # => ["µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö"]

  3. 如果我只选择一个~而不是{{}},那么只需尝试一下,键盘的位置(以及键的kb索引)最终特殊字符定义了哪些字符介于两者之间。 {1}}最后它看起来像这样:

    ?

    注意我故意遗漏`字符,因为它关闭了我的代码部分。

    基本上,如果字符('!'..'~').to_a # => ["!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "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", "{", "|", "}", "~"]a65z,那么将包含90之间的所有字符b,它就像你放在一个范围内的任何东西一样,因为在ruby中一切都是一个对象,你可以使用范围内的任何东西,只要它实现了文档所解释的某些方法!

    编辑(2015年11月13日)

    在我的控制台中进行一些游戏后,我找到了这个“模仿”给定PHP示例的解决方案,甚至可能完成它。

    66

    现在调用complexity = 4 length = 10 def rng(length = 10, complexity = 4) subsets = [("a".."z"), ("A".."Z"), (0..9), ("!".."?"), ("µ".."ö")] chars = subsets[0..complexity].map { |subset| subset.to_a }.flatten # => ["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, "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö"] chars.sample(length).join end 会产生如下结果:

    rng
    rng # => "·boÇE»Ñ¼Á¸"
    rng(10, 2) # => "nyLYAsxJi9"

    所有日期均为dd-mm-yyyy格式