Подтвердить что ты не робот

Как удалить первые n строк из строки в Ruby?

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

remove_lines (2) удалит первые две строки, оставив строку:

Three\n
Four\n
4b9b3361

Ответ 1

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

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

Ответ 2

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", вам необходимо соответствующим образом расширить этот метод.

Ответ 3

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

Ответ 4

У меня была ситуация, когда мне нужно было поддерживать множественную платформу 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

Ответ 5

Эта проблема удалит первые две строки, используя регулярное выражение.

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

EDIT: Я только что увидел, что вопрос касается также строк '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"

Ответ 6

Вот чистый однострочный 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/,'')

Ответ 7

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