JS регулярное выражение для разделения по строке

Как вы разделите длинный фрагмент текста на отдельные строки? Почему это возвращает строку1 дважды?

/^(.*?)$/mg.exec('line1\r\nline2\r\n');

[ "line1", "line1" ]

Я включил многострочный модификатор, чтобы сделать ^ и $ совпадение начала и конца строк. Я также включил глобальный модификатор для захвата всех строк.

Я хочу использовать разделение регулярных выражений, а не String.split, потому что я буду иметь дело с окончанием строки Linux \n и Windows \r\n.

Ответ 1

arrayOfLines = lineString.match(/[^\r\n]+/g);

Как сказал Тим, это как полный матч, так и захват. Похоже, что regex.exec(string) возвращается к поиску первого совпадения независимо от глобального модификатора, если string.match(regex) выполняет глобальную проверку.

Ответ 2

Использование

result = subject.split(/\r?\n/);

Ваше регулярное выражение возвращает line1 дважды, потому что line1 - это как полное совпадение, так и содержимое первой группы захвата.

Ответ 3

Я предполагаю, что следующие символы newlines

  • \r, за которым следует \n
  • \n, за которым следует \r
  • \n присутствует отдельно
  • \r присутствует отдельно

Используйте

var re=/\r\n|\n\r|\n|\r/g;

arrayofLines=lineString.replace(re,"\n").split("\n");

для массива всех строк, включая пустые.

ИЛИ

Используйте

arrayOfLines = lineString.match(/[^\r\n]+/g); 

Для массива непустых строк

Ответ 4

Еще более простое регулярное выражение, которое обрабатывает все комбинации строк, даже смешанные в одном файле, и удаляет также и пустые строки:

var lines = text.split(/[\r\n]+/g);

С прорисовкой пробелов:

var lines = text.trim().split(/\s*[\r\n]+\s*/g);

Ответ 5

Сначала замените все \r\n на \n, затем String.split.

Ответ 6

http://jsfiddle.net/uq55en5o/

var lines = text.match(/^.*((\r\n|\n|\r)|$)/gm);

Я сделал что-то вроде этого. Над ссылкой моя скрипка.