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