簡體   English   中英

如何從Ruby中的字符串中刪除前n行?

[英]How do I remove the first n lines from a string in Ruby?

One\n
Two\n
Three\n
Four\n

remove_lines(2)將刪除前兩行,保留字符串:

Three\n
Four\n

s.to_a [2 ..- 1]。加入

>> s = "One\nTwo\nThree\nFour\n"
=> "One\nTwo\nThree\nFour\n"
>> s.to_a[2..-1].join
=> "Three\nFour\n"
class String

  def remove_lines(i)
    split("\n")[i..-1].join("\n")
  end

end

調用"One\\nTwo\\nThree\\nFour\\n".remove_lines(2)將導致"Three\\nFour" 如果需要尾隨"\\n" ,則需要相應地擴展此方法。

s = "One\nTwo\nThree\nFour"

lines = s.lines
> ["One\n", "Two\n", "Three\n", "Four"]

remaining_lines = lines[2..-1]
> ["Three\n", "Four"]

remaining_lines.join
> "Three\nFour"
  • String#lines將字符串轉換為行數組(在每個字符串的末尾保留新行字符)
  • [2..-1]指定要返回的行的范圍,在這種情況下是第三行到最后一行
  • Array#join將這些行重新連接在一起,沒有任何空格(但由於這些行仍然包含新行字符,因此我們不需要分隔符)

在一行中:

s.lines[2..-1].join

我有一種情況需要支持多個平台EOLN(\\ r和\\ n),並取得了以下成功:

split(/\r\n|\r|\n/, 2).last

或等效的remove_lines

def remove_lines(number_of_lines=1)
  split(/\r\n|\r|\n/, number_of_lines+1).last
end

這是一個純正的regexp單行。 假設它應該比@DigitalRoss提供的優雅解決方案更快:

n = 4 # number of lines
str.gsub(/\A(.*\n){#{n}}/,'')

如果您事先知道要切割多少條線(這里有4條):

str.gsub(/\A(.*\n){4}/,'')

如果你只想削減一行:

str.gsub(/\A.*\n/,'')

為了從尾部切割n行:

gsub(/(\n.*){#{n}}\Z/,'')

此問題將使用正則表達式刪除前兩行。

Text = "One\nTwo\nThree\nFour"
Text = Text.gsub /^(?:[^\n]*\n){2}/, ''
# -----------------------------------^^  (2) Replace with nothing
# ----------------^^^^^^^^^^^^^^^^       (1) Detect first 2 lines
puts Text

編輯:我剛剛看到問題也是' n '行不僅僅是兩行。

所以這是我的新答案。

Lines_Removed = 2
Original_Text = "One\nTwo\nThree\nFour"
Result___Text = (Original_Text.gsub(Regexp.new("([^\n]*\n){%s}" % Lines_Removed), ''))
#                                               ^^^^^^^^^^^^^^                    ^^
# - (1) Detect first  lines -----++++++++++++++                    ||
# - (2) Replace with nothing -----------------------------------------------------++

puts Result___Text # Returns "Three\nFour"
def remove_lines(str, n)
  res = ""
  arr = str.split("\n")[n..(str.size-n)]
  arr.each { |i| res.concat(i + "\n")  }
  return res
end

a = "1\n2\n3\n4\n"
b = remove_lines(a, 2)
print b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM