One\n
Two\n
Three\n
Four\n
remove_lines (2) удалит первые две строки, оставив строку:
Three\n
Four\n
One\n
Two\n
Three\n
Four\n
remove_lines (2) удалит первые две строки, оставив строку:
Three\n
Four\n
>> 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
Эта проблема удалит первые две строки, используя регулярное выражение.
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"
Вот чистый однострочный 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/,'')
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