当前位置:  开发笔记 > 后端 > 正文

ruby正则表达式扫描和gsub与块中的捕获组的工作方式不同

如何解决《ruby正则表达式扫描和gsub与块中的捕获组的工作方式不同》经验,为你挑选了1个好方法。

我有一串数字和字母交替.我想用前面的字母数替换每个字符.例如,2a3b应该返回aabbb.

首先,如果我这样做:

"2a3b".scan(/(\d)(.)/) do |count, char|
  puts char * count.to_i
end 

我明白了:

aa
bbb

但是,如果我这样做:

"2a3b".gsub(/(\d)(.)/) do |count, char|
  char * count.to_i
end 

我收到一个错误:

NoMethodError: undefined method `*' for nil:NilClass

它们不应该都表现相同(更新:我的意思是,接受捕获组作为块参数)?

更新 :(解决方法,有效)

"2a3b".gsub(/(\d)(.)/) do |match|
  $2 * $1.to_i
end 

收益:

"aabbb"

正如所料.



1> peter..:

不,他们的行为不一样.gsub的块形式只接受一个参数,所以第二个将是nil,因此你的错误.见http://ruby-doc.org/core-2.1.4/String.html#method-i-gsub

使用示例: "hello".gsub(/./) {|s| s.ord.to_s + ' '}

在块形式中,当前匹配字符串作为参数传入,并且将适当地设置诸如$ 1,$ 2,$`,$&和$'的变量.块返回的值将替换每次调用的匹配.

结果继承了原始字符串或任何提供的替换字符串中的任何污点.

推荐阅读
虎仔球妈_459
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有