使用正则表达式用不同的数字集替换不同的字符集

时间:2014-01-19 18:48:19

标签: ruby regex

我正在尝试用ord中的某个数字替换字符串中的字符。我认为最好的方法是使用正则表达式,但遇到一些问题。

这是我所拥有的有缺陷的代码

def cipher(coded_message)
  coded_message=coded_message.downcase.split("")
  new_message=[]
  coded_message.each do |x|
    x=x.gsub(/[a-d][e-z]/, '\1x.ord+22\2x.ord-4')
    new_message<<x
  end
  p new_message.join
end

我知道我的问题在于正则表达式,可能还有替换文本,但不知道在哪一步。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

好的,所以我采取了不同的方法来解决你的问题。这是一个不涉及regex的解决方案,并且非常灵活。

def cipher(coded_message)
  new_message=[]
  coded_message.downcase.each_char do |x|
    case x
    when ("a".."d")
      new_message << (x.ord+22).chr
    when ("e".."z")
      new_message << (x.ord-4).chr
    end
  end
  new_message.join
end

cipher("Code this string")
 #=> "ykzapdeoopnejc" 

答案 1 :(得分:1)

如果您无法对其进行解码,则无法对邮件进行编码:

@code_key = 123.times.with_object({}) do |i,h|
  c = i.chr
  h[c] =
    case c
    when /[a-dA-D]/ 
      (i+22).chr
    when /[e-zE-Z]/
      (i-4).chr
    else
      c
    end
end

@decode_key = @code_key.invert

def code(message)
  @code_key.values_at(*message.chars).join
end

def decode(message)
  @decode_key.values_at(*message.chars).join
end

message = "Is 42 an important number?"
coded_message   = code(message)         # => "Eo 42 wj eilknpwjp jqixan?"
decoded_message = decode(coded_message) # => "Is 42 an important number?"