![](/img/trans.png)
[英]ruby regex scan and gsub work differently with capture groups in blocks
[英]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.