我现在对ruby很新,但我来自PHP背景,必须说我喜欢做ruby,很多。这是一个非常好的语言,社区是严格但有帮助的。
今天我正在查看stackoverflow并检查我的answers之一问题以使用PHP生成随机字符串。我实际上已经写了一个脚本,所以我想,为什么不分享它!
此脚本有一些修饰符,允许您选择是否要包含以下集合
因此,在这个PHP脚本中,我将每个集合物理地键入一个数组,例如:
$charSubSets = array(
'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'0123456789',
'!@#$%^&*()_+{}|:">?<[]\\\';,.`~',
'µñ©æáßðøäåé®þüúíóö'
);
这基本上是我能够在那里定义复杂性的方式。
现在这看起来还不错,即使在代码中,但ruby有ranges并且范围对我来说是一个新的和有光泽的东西所以我想在今天晚些时候构建一个随机字符串生成器只是为了获得更多的经验用它。
现在我的问题是,我知道您可以使用以下范围执行以下操作:
'a'..'z'
'A'..'Z'
0..9
等等。但我在想,你能用特殊字符制作一个范围吗?如,只特殊字符?如果那是可能的,你是否也可以为疯狂的伏都魔做同样的事情?
我问的原因是因为docs中没有任何例子,或者SO上有任何解释这一点的例子。
答案 0 :(得分:4)
查看从{Enumerable获得的Range#to_a
。请注意,在docs的左侧,它表示Range包含Enumerable,这意味着可以在Ranges上调用Enumerable中的方法。如果在类中找不到方法,请查看文档所说的包含的模块,然后单击指向所包含模块的链接。
查看Array#shuffle
。
查看Array#join
查看Array#[]
,它将采用范围作为下标,因此您可以获取一系列随机字符。
两点范围包括结尾。三点范围不包括结尾:
p (1...5).to_a #=> [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
(莎士比亚最终将出现在那里。)
答案 1 :(得分:3)
是的 - 这肯定是可能的。
启动你的控制台,例如irb
或pry
为特殊字符
('!'..'?').to_a # => ["!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?"]
代表'voodooh'字符
('µ'..'ö').to_a # => ["µ", "¶", "·", "¸", "¹", "º", "»", "¼", "½", "¾", "¿", "À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö"]
如果我只选择一个~
而不是{{}},那么只需尝试一下,键盘的位置(以及键的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", "{", "|", "}", "~"]
为a
且65
为z
,那么将包含90
之间的所有字符b
,它就像你放在一个范围内的任何东西一样,因为在ruby中一切都是一个对象,你可以使用范围内的任何东西,只要它实现了文档所解释的某些方法!
在我的控制台中进行一些游戏后,我找到了这个“模仿”给定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格式