【问题标题】:Generate a range of special characters with ruby使用 ruby​​ 生成一系列特殊字符
【发布时间】:2016-02-14 23:19:10
【问题描述】:

我现在对 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] + 一些疯狂的巫毒角色

所以在这个 PHP 脚本中,我将每个集合物理地输入到一个数组中,例如:

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

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

现在看起来没问题,即使在代码中,但 ruby​​ 有 ranges 并且范围对我来说是新的和闪亮的东西,所以我想在今天晚些时候构建一个随机字符串生成器,只是为了获得更多的经验.

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

  1. 'a'..'z'
  2. 'A'..'Z'
  3. 0..9

等等。但我在想,你能不能也用特殊字符来做一个范围?如,只有个特殊字符?如果那个是可能的,你是否也能为疯狂的巫毒做同样的事情?

我问的原因是因为docs 中没有任何例子或任何关于 SO 的解释。

【问题讨论】:

  • 你能不能也用特殊字符做一个范围?例如,只有特殊字符? 对于字符范围,ruby 会查看范围开头和结尾的 ascii 代码。对于 Sidney 的答案中的范围 '!'..'?',范围的开头 ! 的 ascii 代码为 31,范围的结尾 ? 的 ascii 代码为 63,因此所有带有start 和 end 之间的 ascii 代码将包含在该范围内。看一个ascii图表。范围也适用于非 ASCII 字符。在这种情况下,请查看 unicode 图表,例如("\u01f1".."\u01fa").to_a
  • @7stud 太棒了,我回答了这个问题问答风格,因为我自己尝试了一下,在互联网上没有看到明确的例子,所以我尝试在这里创建一个! Ruby 和 PHP 在便利性方面也大不相同。
  • 我以问答方式回答了这个问题。哈!我没注意到。

标签: ruby range


【解决方案1】:
  1. 查看从 Enumerable 获得的 Range#to_a。请注意,docs 的左侧表示 Range 包含 Enumerable,这意味着可以在 Ranges 上调用 Enumerable 中的方法。如果您在类中找不到方法,请查看文档中提到的模块包含,然后单击包含模块的链接。

  2. 查看Array#shuffle

  3. 查看Array#join

  4. 查看Array#[],它将一个范围作为下标,因此您可以获取随机字符数组的切片。

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

    p (1...5).to_a #=&gt; [1, 2, 3, 4]

把它们放在一起:

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

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

【讨论】:

  • 这是对原始问题的一个很好的补充,这很有帮助 - 谢谢!
  • chars.sample(5).join
  • 你也可以写chars = [*0..9, *'A'..'z', *'!'..'?']。我第三次执行sizes = Array.new(1 + rand(20)) { 1 + rand(5) }; sizes.map { |n| chars.sample(n).join }.join(' ')sizes[2,5,2,3,4,2,5,4,3]map/join 返回“如果音乐是爱的食物,请继续播放。”。
  • @Cary Swoveland,该死的。我必须继续努力!
【解决方案2】:

是的 - 这当然是可能的。 启动您的控制台,例如irbpry

1。对于特殊字符:

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

2。对于“巫毒”字符:

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

如果我选择 ~ 而不是 ?最后它看起来像这样:

('!'..'~').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", "{",
#     "|", "}", "~"
# ]

基本上如果字符a65 并且z90 那么所有字符之间的所有字符都像b 这是66 将被包括在内,它就像你放在一个范围内的任何东西一样因为在 ruby​​ 中一切都是对象,所以您可以使用范围内的任何东西,只要它实现了文档中解释的某些方法!

编辑(2015 年 13 月 11 日)

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

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"  
rng(20, 2)  # => "EOcQdjZa0t36xCN8TkoX"

编辑#2 (14-05-2020)

正如下面在 cmets 中指出的,我什至没有提供相关概念的文档链接,在 Ruby 中,这称为 Range,可以在 here (2.5.0) 找到。

如果您需要特定版本的文档,请尝试在 Google 上搜索 ruby range [your ruby version]。您可以通过在终端中运行 ruby -v 来了解您的版本。快乐的红宝石:D

所有日期均采用 dd-mm-yyyy 格式

【讨论】:

  • 请注意,我故意省略了 ` 字符,因为它关闭了我的代码部分。 --是的,编号列表不适用于代码,所以我避免使用它们只需使用1), 2), 3)
  • @7stud Ahh 这不是原因 - 它是关于用反引号括起来的内联代码,但反引号是我输入的范围内的实际字符,以便在完成之前关闭我的内联代码: ) 我通过在末尾添加 2 个空格以在同一段落中创建一个换行符将这段代码放入一个编号列表中,以便它下面的代码将在那里:)
  • 好的,我查了一下:如果里面有文字反引号,请在外面使用双反引号。 :)
  • @7stud Aight!谢谢你,我会记住的!
  • chars.shuffle.sample(4) 双重洗牌?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
相关资源
最近更新 更多