我想用大写字母替换字符串的第三个字符。使用gsub
或sub
会导致以下错误:
"Hiiiii".sub!(string[2,1],string[2,1].upcase!) # => hIiiii
"Hello".gsub!(string[2,1],string[2,1].upcase!) # => heLLo
虽然gsub
意外取代了所有相似的字符,sub
取代了第一次出现,而不管我提到的位置。
有人可以建议我如何让sub
仅在第三个角色之后工作吗?
答案 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