在某些行上的字母之间插入符号

时间:2015-09-21 12:00:58

标签: ruby regex

我正在操纵文字。我想在每一行的大写字母之间加一个点,除了以单词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('')

3 个答案:

答案 0 :(得分:3)

^name\b.*( *SKIP)( *F)|(?<=[A-Z])(?=[A-Z])

您可以使用SKIPF来阻止从name开始的行。请参见{更新.

https://regex101.com/r/vV1wW6/27

答案 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