[英]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.