中间行的Ruby替换字符?

中间行的Ruby替换字符?,ruby,regex,Ruby,Regex,嗨,我在读一本关于Ruby的教科书,发现我可以用 .sub(/^../,'hello') .sub(/..$/,'hello') 替换第一行中的第一个或最后两个字符 我在想,如果有多行,我怎么能在其他行中替换一些 例如 结果是: aaaHellob ccc ddd 它改变了第二行的前两个字符,但不知何故第二行移到了第一行 所以我的问题是,我如何改变(替换)某一行中的字符? 如果你能解释一下我为什么会得到这个结果,我将非常感激 谢谢。拆分行、替换特定行和连接行如何 >> x =

嗨,我在读一本关于Ruby的教科书,发现我可以用

.sub(/^../,'hello') 
.sub(/..$/,'hello')
替换第一行中的第一个或最后两个字符

我在想,如果有多行,我怎么能在其他行中替换一些

例如

结果是:

aaaHellob
ccc
ddd
它改变了第二行的前两个字符,但不知何故第二行移到了第一行

所以我的问题是,我如何改变(替换)某一行中的字符? 如果你能解释一下我为什么会得到这个结果,我将非常感激


谢谢。

拆分行、替换特定行和连接行如何

>> x = <<end_string
aaa
bbb
ccc
ddd
end_string
>> lines = x.split("\n")
>> lines[1].sub!(/../, 'hello')
>> lines = lines.join("\n")
>> puts lines
aaa
hellob
ccc
ddd
>x=lines=x.split(“\n”)
>>行[1]。子!(/../,“你好”)
>>行=行。连接(“\n”)
>>放线
aaa
你好
ccc
ddd

之所以得到该结果,是因为
sub
替换了它匹配的字符串。因为您匹配了换行符(并且在替换文本中没有使用换行符),所以字符串后面的换行符更少

简单的解决方案是在替换文本中使用换行符:

irb> puts x.gsub(/\n../, "\nHELLO")
aaa
HELLOb
HELLOc
HELLOd
#=> nil 
如果不想在最后一行操作,可以使用负前瞻:

irb> puts x.gsub(/\n..(?!.*\Z)/, "\nHELLO")
aaa
HELLOb
HELLOc
ddd
#=> nil 
您可以使用正向查找来避免在替换字符串中使用换行符

irb> puts x.gsub(/(?<=\n)..(?!.*\Z)/, "HELLO")
aaa
HELLOb
HELLOc
ddd
#=> nil 
irb>放入x.gsub(/(?nil
lookahead和lookbehinds的语法有点奇怪,但它们的存在只是为了将模式(匹配并消耗一定长度的文本)转换为与文本中零宽度位置匹配的模式。正则表达式中已经存在零宽度位置匹配,使用:

  • ^
    用于行首
  • $
    用于行尾
  • \b
    用于单词边界
  • \A
    用于字符串开头
  • \Z
    用于字符串结尾
Lookaheads和lookbehinds只是让您定义自己的:

  • (?=PAT)
    ~在PAT之前匹配
  • (?
    
irb> puts x.gsub(/\n..(?!.*\Z)/, "\nHELLO")
aaa
HELLOb
HELLOc
ddd
#=> nil 
irb> puts x.gsub(/(?<=\n)..(?!.*\Z)/, "HELLO")
aaa
HELLOb
HELLOc
ddd
#=> nil