Как заменить символ в середине строки случайным символом? - PullRequest
0 голосов
/ 12 января 2019

Я проверяю значения строки, которая является уникальным идентификатором для сторонней службы, которая имеет некоторые строгие правила относительно идентификатора. Если создается дубликат, мне нужно его перехватить и заменить символ, чтобы сделать его уникальным. Правила: Это должна быть строка, она должна быть длиной не более 21 символа, последние четыре символа являются значимыми и предустановлены и не могут быть изменены, первые 15 символов являются значимыми и предустановлены и не могут быть изменены, поэтому У меня есть только два символа, которые я могу изменить, и, наконец, другая сторонняя система устанавливает строку и с удовольствием продублирует их, если обстоятельства будут правильными. Они всегда правы. лайк. всегда ... LOL

Сначала я подумал об использовании str.next! но это нарушает последние четыре правила. Затем я попробовал str.insert (-5, rand (9) .to_s). Это изменит один из правильных символов и сделает строку уникальной, но это нарушает правило <= 21 символов. </p>

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 голосов
/ 12 января 2019

Я предположил, что заменяемые символы не обязательно должны быть случайными, а просто отличаться друг от друга и отличаться от всех других символов в строке. Если они по какой-либо причине выбираются случайным образом, требуется дополнительная конкретность, в частности, набор символов, из которых символы должны быть выбраны случайным образом. У меня есть еще один комментарий по этому поводу в конце моего ответа.

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"

Это не меняет ("mutate") str. Чтобы изменить строку, измените последнюю строку на:

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

Сейчас:

s #=> "abcdefrqsjklmnogh_123"  

Если заменяющие символы должны выбираться случайным образом (но удовлетворять свойствам уникальности, указанным в начале), константа PERMITTED_CHARS будет установлена ​​равной строке, содержащей символы, из которых будет взята случайная выборка. available_chars будет вычислено как сейчас, но available_chars[0, nbr_replacements] будет изменено на available_chars.sample(nbr_replacements).

0 голосов
/ 17 января 2019

Используя гем 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
0 голосов
/ 12 января 2019

Самым ярким для меня было бы что-то вроде:

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

Если я правильно понимаю.

...