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

Разделить на разных символах новой строки

Сейчас я делаю split в строке и предполагая, что новая строка от пользователя \r\n выглядит так:

string.split(/\r\n/)

То, что я хотел бы сделать, разбивается на \r\n или просто \n.

Итак, как будет разделяться регулярное выражение на любом из этих?

4b9b3361

Ответ 1

Вы попробовали /\r?\n/? ? делает \r необязательным.

Пример использования: http://rubular.com/r/1ZuihD0YfF

Ответ 2

# Split on \r\n or just \n
string.split( /\r?\n/ )

Хотя это не помогает в этом вопросе (где вам нужно регулярное выражение), обратите внимание, что String#split не требует аргумента regex. Ваш исходный код также мог бы быть string.split( "\r\n" ).

Ответ 3

Ruby имеет методы String#each_line и String#lines

возвращает перечисление: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-each_line

возвращает массив: http://www.ruby-doc.org/core-2.1.2/String.html#method-i-lines

Я не тестировал его против вашего сценария, но я уверен, что он будет работать лучше, чем вручную выбирать символы новой строки.

Ответ 4

Оператор чередования в Ruby Regexp такой же, как в стандартных регулярных выражениях: |

Итак, очевидное решение было бы

/\r\n|\n/

что совпадает с

/\r?\n/

то есть. необязательный \r, за которым следует обязательный \n.

Ответ 5

Может быть, разбить только "\n" и удалить "\ r", если он существует?

Ответ 6

Вы читаете из файла или из стандартного в?

Если вы читаете из файла, а файл находится в текстовом режиме, а не в двоичном режиме, или вы читаете стандартную версию, вам не придется иметь дело с \r\n - это будет просто выглядите как \n.

C:\Documents and Settings\username>irb
irb(main):001:0> gets
foo
=> "foo\n"

Ответ 7

Другим вариантом является использование String # chomp, которое также само по себе обрабатывает новые строки.

Вы можете выполнить то, что вам нужно, с чем-то вроде:

lines = string.lines.map(&:chomp)

Или если вы имеете дело с чем-то достаточно большим, чтобы использовать память:

<string|io>.each_line do |line|
  line.chomp!
  #  do work..
end

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

На моей машине (i7, ruby ​​2.1.9):

Warming up --------------------------------------
           map/chomp    14.715k i/100ms
  split custom regex    12.383k i/100ms
Calculating -------------------------------------
           map/chomp    158.590k (± 4.4%) i/s -    794.610k in   5.020908s
  split custom regex    128.722k (± 5.1%) i/s -    643.916k in   5.016150s

Ответ 8

\n is for unix 
\r is for mac 
\r\n is for windows format

Чтобы быть безопасным для операционных систем. Я бы сделал /\ r?\N |\r\n?/

"1\r2\n3\r\n4\n\n5\r\r6\r\n\r\n7".split(/\r?\n|\r\n?/)
=> ["1", "2", "3", "4", "", "5", "", "6", "", "7"]