2014-01-19 49 views
0

我想用一些數字替換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 

我知道,我的問題是與正則表達式,並可能替換文本,但不知道去哪裏就這一個。任何幫助,將不勝感激。

+0

你需要捕獲組,如果語言不允許插值,那麼你就需要一個匿名函數。 – nhahtdh

回答

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" 
+0

+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?" 
+0

'coded_message.downcase.split(「」)'可以寫成'coded_message.downcase.each_char.with_object([])'.. –

+1

謝謝,@Arup。我只是盲目地複製了該部分。將編輯。 –

+0

現在使用'do..end'塊..而不是'{..}',它看起來更具有rubyistic。然後你不需要使用*/\ *。在這種情況下,顯然你必須刪除'puts'。使用'放置密碼(「現在是時間」)'。 –