簡體   English   中英

Ruby正則表達式捕獲gsub中的組

[英]Ruby regex capture groups in gsub

假設我想切換消息中的每個字母,並將其放在反向字母表中。 為什么我似乎無法使用捕獲的組並在一個gsub中執行此操作?

也許有人可以解釋一下在gsub中使用捕獲的組,可以反向引用是否裸露(沒有'')? 我可以使用#{\\ 1}嗎?

def decode(message)
  a = ('a'..'z').to_a
  z = a.reverse
  message.gsub!(/([[:alpha:]])/, z[a.index('\1')]) 
end

decode("the quick brown fox")

請記住,立即計算方法的參數,並將結果傳遞給方法。 如果你想讓替換適應匹配:

message.gsub!(/([[:alpha:]])/) { |m| z[a.index($1)] }

它使用一個塊來評估每個匹配。

使用gsub

您的代碼無效,因為'\\1'尚未被評估為其正則表達式匹配,在您需要的時候。 這可以通過使用塊來解決,因此定義了匹配變量:

message.gsub(/[[:alpha:]]/) { |char| z[a.index(char)] }

使用tr

解決這類問題的一種更有效的方法,就是使用String#tr來簡單地“用另一組替換一組字符”。 這可以按如下方式完成:

message.tr(a.join(''), z.join(''))

一種方法是操縱ASCII值。

def code(message)
  message.gsub(/[[:alpha:]]/) { |s| (((s < 'a') ? 155 : 219 ) - s.ord).chr }
end

coded = code("the quick brown fox")
  #=> "gsv jfrxp yildm ulc" 
code(coded)
  #=> "the quick brown fox" 

注意:

'A'.ord + 'Z'.ord
  #=> 155 
'a'.ord + 'z'.ord
  #=> 219 

另一種是使用哈希:

a = ('a'..'z').to_a
Ch = a.zip(a.reverse).to_h
  #=> {"a"=>"z", "b"=>"y",..., "y"=>"b", "z"=>"a"} 

def code(message)
  message.gsub(/[[:alpha:]]/, Ch)
end

coded = code("the quick brown fox")
  #=> "gsv jfrxp yildm ulc"
code(coded)
  #=> "the quick brown fox"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM