我正在操纵文字。我想在每一行的大写字母之间加一个点,除了以单词name
开头的行。例如:
right VGS
flat DASabcdf
foot
foobar asdfsadf. ASDFSADF
name Lorem ipsum dolor. ASDF
ASDF
应该成为
right V.G.S
flat D.A.Sabcdf
foot
foobar asdfsadf. A.S.D.F.S.A.D.F
name Lorem ipsum dolor. ASDF
A.S.D.F
我尝试了line.gsub(/(?=[A-Z])(?<=[A-Z])/, ".")
,但它在所有行中的大写字母之间加了一个点。然后我尝试line.gsub(/^(?!name)(.*?)(?=[A-Z])([A-Z]*)(.*$)/, '\1\2.split('').join('.')\3')
,但它放了:
right VGS.split('').join('')
flat DAS.split('').join('')abcdf
foot
foobar asdfsadf. ASDFSADF.split('').join('')
name Lorem ipsum dolor. ASDF
ASDF.split('').join('')
答案 0 :(得分:3)
^name\b.*( *SKIP)( *F)|(?<=[A-Z])(?=[A-Z])
您可以使用SKIP
和F
来阻止从name
开始的行。请参见{更新.
答案 1 :(得分:2)
我建议循环遍历多行字符串中的所有行,并在开头测试单词name
,并仅修改通过测试的行:
output = ""
str.each_line do |line|
if !line.start_with?("name")
output += line.gsub(/(?=[A-Z])(?<=[A-Z])/, ".")
else
output += line
end
end
请参阅IDEONE demo
答案 2 :(得分:1)
让我们先创建一个输入文件:
str = <<_
right VGS
flat DASabcdf
foot
foobar asdfsadf. ASDFSADF
name Lorem ipsum dolor. ASDF
ASDF
_
FNameIn = 'text_in'
FNameOut = 'text_out'
IO.write(FNameIn, str)
你可以按照以下方式做你想做的事:
f = File.open(FNameOut, 'w')
IO.foreach(FNameIn) do |line|
f.puts(line =~ /^[nN]ame\b/ ? line :
line.gsub(/[A-Z]{2,}/) { |s| s.split('').join('.') })
end
f.close
让我们确认一下:
puts IO.read(FNameOut)
#=> right V.G.S
# flat D.A.Sabcdf
# foot
# foobar asdfsadf A.S.D.F.S.A.D.F
# name Lorem ipsum dolor. ASDF
# A.S.D.F