带有索引/偏移量的Ruby gsub?

Posted

技术标签:

【中文标题】带有索引/偏移量的Ruby gsub?【英文标题】:Ruby gsub with index/offset? 【发布时间】:2012-08-25 08:45:21 【问题描述】:

Ruby 的String#gsub 方法是否提供了包含替换索引的方法?例如,给定以下字符串:

我喜欢你,你,你,还有你。

我想得到这个输出:

我喜欢你1、你2、你3和你4。

我知道我可以使用\1\2 等来匹配括号中的字符,但是有没有像\i\n 这样的东西可以提供当前匹配的编号?

值得一提的是,我的实际字词并不像“你”那么简单,因此假设搜索字词是静态的替代方法是不够的。

【问题讨论】:

示例代码假设 "you" 很容易被您修改以替换任何需要的目标或正则表达式。 【参考方案1】:

我们可以将with_index 链接到gsub() 以获取:

foo = 'I like you, you, you, and you.'.gsub(/\byou\b/).with_index  |m, i| "#m#1+i" 
puts foo

哪个输出:

I like you1, you2, you3, and you4.

【讨论】:

each_with_indexwith_index 都是无名英雄。 我承认我忽略了最新的! 我什至没有注意到with_index 可以与subgsub 一起使用! 我觉得这太酷了! foo = 'I like you, you, you, and you.'.gsub(/\byou\b/).with_index |m, i| i == 2 ? "#m#1+i" : "#m" ,输出#=> "I like you, you, you3, and you." 漂亮!谢谢你:)【参考方案2】:

这可行,但很丑:

n = 0; 
"I like you, you, you, and you.".gsub("you")  val = "you" + n.to_s; n+=1; val 
=> "I like you0, you1, you2, and you3."

【讨论】:

如果替换字符串也包含像 \1 这样的值怎么办?如何在匹配的字符串中用 $1 正确替换它?例如: "hello".gsub(/(ello)/, "i and h\1") 将产生 "hi and hello"。如何在块中考虑这些替换?【参考方案3】:

这有点老套,但你可以使用一个变量,在传递给 gsub 的块内递增

source = 'I like you, you, you, and you.'
counter = 1
result = source.gsub(/you/) do |match|
  res = "#match#counter"
  counter += 1
  res
end

puts result
#=> I like you1, you2, you3, and you4.

【讨论】:

相同(丑陋!)答案,相同时间 => +1 :) 如果替换字符串也包含\1 之类的值怎么办?如何在匹配的字符串中用$1 正确替换它?例如:"hello".gsub(/(ello)/, "i and h\1") 将产生“hi and hello”。如何在块中考虑这些替换? @MattHuggins:为每个组调用该块。使用"i and h#match" 将产生您正在寻找的东西 我很好奇为什么有人会投反对票。评论会很有帮助,所以我可以解决这个问题

以上是关于带有索引/偏移量的Ruby gsub?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?

滚动到带有偏移量的 div ID

在 SOX 中混合带有偏移量的音轨

具有自定义数据源偏移量的 Android 分页库 RecyclerView 中的项目

Ruby each_with_index 偏移量

为啥 MongoDB skip() 不使用索引?