如何用随机字符替换字符串中间的字符?

时间:2019-01-12 04:17:25

标签: ruby-on-rails ruby string replace insert

我正在检查字符串的值,该字符串是第三方服务的唯一标识符,该标识符具有关于标识符的一些严格规则,如果生成重复项,则需要捕获它并替换一个字符以使其唯一。规则:必须为字符串,长度必须小于或等于21个字符,后四个字符有效且已预设且不能更改,前15个字符有效且已预设且不能更改,因此我只有两个可以更改的字符,最后另一个第三方系统设置了字符串,并在情况合适的情况下很乐意复制它们。他们总是对的。喜欢。总是...大声笑

起初我想到使用str.next!但这违反了最后四个规则。然后,我尝试了str.insert(-5,rand(9).to_s),这将更改正确的字符之一并使该字符串唯一,但它违反了<= 21个字符的规则。

str = "abcdefghijklmnoXX_123" (I can safely alter the XX)
str.next! (makes it unique but violates last four rule)
str.insert(-5, rand(9).to_s) (alters the correct characters and makes it unique, but violates the str.length rule.  

如何在不更改字符串长度或不违反任何其他规则的情况下替换正确的字符集?哦,最好也不要缩短字符串的长度。

3 个答案:

答案 0 :(得分:0)

对我而言,座驾就像:

prefix = str[0..14]
middle = str[15..17]
suffix = str[18..-1]
unique_id = prefix + middle.next + suffix

如果我理解正确。

答案 1 :(得分:0)

我假设要替换的字符不必是随机的,而只是彼此不同并且与字符串中的所有其他字符不同。如果出于某种原因要随机选择它们,则需要进一步的特殊性,特别是要从中随机抽取字符的字符集合。我在回答的结尾对此有进一步的评论。

vSum

这不会修改(“变异”)REQD_BEGIN = 15 REQD_END = 4 PERMITTED_CHARS = ('a'..'z').to_a.join #=> "abcdefghijklmnopqrstuvwxyz" str = "abcdefrqsjklmnoXX_123" nbr_replacements = str.size - REQD_BEGIN - REQD_END #=> 2 available_chars = PERMITTED_CHARS.delete(str[0,REQD_BEGIN].downcase + str[-REQD_END, REQD_END].downcase) #=> "ghiptuvwxyz" str[0, REQD_BEGIN] + available_chars[0, nbr_replacements] + str[-REQD_END, REQD_END] #=> "abcdefrqsjklmnogh_123" 。要变异字符串,请将最后一行更改为:

str

现在:

s[REQD_BEGIN, nbr_replacements] = available_chars[0, nbr_replacements]
  #=> "gh" 

如果要随机选择替换字符(但要满足开始时列出的唯一性属性),则常数s #=> "abcdefrqsjklmnogh_123" 将设置为等于包含从中抽取随机样本的字符的字符串。 PERMITTED_CHARS会像现在这样计算,但是available_chars将更改为available_chars[0, nbr_replacements]

答案 2 :(得分:0)

通过使用string_pattern宝石:https://github.com/MarioRuiz/string_pattern

require 'string_pattern'
str = "abcdefghijklmnoXX_123"
new_str = str[0..14] + "2:L".gen + str[17..20]

#or also like this
new_str = [str[0..14], "2:L", str[17..20]].gen

如果您想生成始终唯一的代码,则不要在执行开始时重复任何字符串,然后将其添加到字符串模式&末尾:

# one unique string during the whole execution
new_str = [str[0..14], "2:L&", str[17..20]].gen

# generate 100 unique strings and store them on an array
unique_strings = []
100.times do
  unique_strings << [str[0..14], "2:L&", str[17..20]].gen
end