使用gsub或sub替换一个字符

时间:2014-06-21 19:01:39

标签: ruby regex string gsub

我想用大写字母替换字符串的第三个字符。使用gsubsub会导致以下错误:

"Hiiiii".sub!(string[2,1],string[2,1].upcase!) # => hIiiii

"Hello".gsub!(string[2,1],string[2,1].upcase!) # => heLLo

虽然gsub意外取代了所有相似的字符,sub取代了第一次出现,而不管我提到的位置。

有人可以建议我如何让sub仅在第三个角色之后工作吗?

3 个答案:

答案 0 :(得分:6)

使用以下简单方法,使用String#[]访问特定字符,使用String#[]=替换任何特定字符。

str = "Hiiiii"
str[2] = str[2].upcase
str # => "HiIiii"

答案 1 :(得分:6)

如果要传递某个模式,其长度可以在匹配之前由正则表达式确定,则可以使用正向lookbehind来传递该模式。

最好使用sub!,因为它仅适用一次(而不是使用gsub!锚定\A,如编辑前的hwnd回答)。

"Hiiiii".sub!(/(?<=.{2})./, &:upcase)
# => "HiIiii"

"Hello".sub!(/(?<=.{2})./, &:upcase)
# => "HeLlo"

答案 2 :(得分:5)

您可以使用带有正面观察的正则​​表达式来执行此操作。 Lookarounds不消耗字符串中的字符,但仅断言是否可以匹配。

"Hiiiii".sub(/(?<=..)./, &:upcase)
 # => "HiIiii"

<强>解释

(?<=       # look behind to see if there is:
  .        #  any character except \n
  .        #  any character except \n
)          # end of look-behind
.          # any character except \n