Ответ 1
Вы попробовали /\r?\n/
? ?
делает \r
необязательным.
Пример использования: http://rubular.com/r/1ZuihD0YfF
Сейчас я делаю split
в строке и предполагая, что новая строка от пользователя \r\n
выглядит так:
string.split(/\r\n/)
То, что я хотел бы сделать, разбивается на \r\n
или просто \n
.
Итак, как будет разделяться регулярное выражение на любом из этих?
Вы попробовали /\r?\n/
? ?
делает \r
необязательным.
Пример использования: http://rubular.com/r/1ZuihD0YfF
# Split on \r\n or just \n
string.split( /\r?\n/ )
Хотя это не помогает в этом вопросе (где вам нужно регулярное выражение), обратите внимание, что String#split
не требует аргумента regex. Ваш исходный код также мог бы быть string.split( "\r\n" )
.
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
Я не тестировал его против вашего сценария, но я уверен, что он будет работать лучше, чем вручную выбирать символы новой строки.
Оператор чередования в Ruby Regexp
такой же, как в стандартных регулярных выражениях: |
Итак, очевидное решение было бы
/\r\n|\n/
что совпадает с
/\r?\n/
то есть. необязательный \r
, за которым следует обязательный \n
.
Может быть, разбить только "\n" и удалить "\ r", если он существует?
Вы читаете из файла или из стандартного в?
Если вы читаете из файла, а файл находится в текстовом режиме, а не в двоичном режиме, или вы читаете стандартную версию, вам не придется иметь дело с \r\n
- это будет просто выглядите как \n
.
C:\Documents and Settings\username>irb
irb(main):001:0> gets
foo
=> "foo\n"
Другим вариантом является использование 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
\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"]