Разделить строку шаблона на разрывы строк, игнорируя литерал \n

У меня есть текстовые данные в нескольких строках, хранящиеся в строке шаблона ES6. Любая строка может содержать буквальную строку \n. Пример:

`line1
same\nline2
line3`

Я хочу разбить эту строку на массив строк, где каждая строка происходит из строки строки шаблона, без разделения на литерал \n внутри строки. Таким образом, моим ожидаемым/желаемым результатом был массив JavaScript, выглядящий так: ["line1", "same\nline2", "line3"].

Глядя на приведенный ниже пример, очевидно, что этого не происходит при простом разделении с использованием регулярного выражения для разрывов строк (/\n/).

Так возможно ли это вообще? Я что-то упустил/не понял о том, как работают строки шаблона?

const lines = `line1
same\nline2
line3`.split(/\n/);

document.getElementById('out').textContent = JSON.stringify(lines)
<pre id="out"></pre>


person alex3683    schedule 24.05.2018    source источник
comment
Проблема в том, что \n в литерале шаблона анализируется идентично до разрыва строки литерала — попробуйте console.logизменить строку перед ее разбиением. Может быть, вместо этого вы хотели \\n в литерале шаблона?   -  person CertainPerformance    schedule 24.05.2018
comment
Было бы неплохо иметь \\n в литерале шаблона, но я экспортировал данные из базы данных SQL. Вывод состоит из нескольких строк с некоторыми \n между ними. Теперь я избежал этих разрывов строк в текстовом редакторе. Я надеялся пропустить промежуточный шаг.   -  person alex3683    schedule 24.05.2018
comment
@ alex3683 Ваша база данных SQL создала код JS? Я думаю, вы должны добавить соответствующее экранирование в эту функцию экспорта.   -  person Bergi    schedule 24.05.2018
comment
@Bergi Нет, не код JS. Только данные в стиле значений, разделенных табуляцией. Я просто скопировал его из диспетчера SQL и хотел поместить в строку шаблона в моей функции JavaScript.   -  person alex3683    schedule 24.05.2018
comment
@ alex3683 Да, просто скопируйте эту копию из результата SQL и поместите ее в процесс кода JS. По возможности следует автоматизировать этот процесс и использовать соответствующий механизм экранирования, например заставляет механизм SQL выводить JSON (это только первый результат поиска, который я получил).   -  person Bergi    schedule 24.05.2018
comment
@ Берги Ты совершенно прав. Мой план состоит в том, чтобы автоматизировать это. Мне просто нужен был какой-то быстрый и грязный способ доступа к данным и их обработки, и вот что я придумал. ;-) В любом случае, я подумал, что это было бы полезно знать на будущее при работе со строками шаблонов. Тем не менее, полезный вопрос о стеке, по крайней мере, для меня :-)   -  person alex3683    schedule 24.05.2018


Ответы (2)


Вы можете использовать тег String.raw. на литерал вашего шаблона:

const lines = (String.raw `line1
same\nline2
line3`).split(/\n/);

console.log(lines);
person Bergi    schedule 24.05.2018
comment
Отлично. Это как раз то, что я надеялся, существует! Спасибо! :-) - person alex3683; 24.05.2018

\n рассматривается как новая строка, и регулярное выражение всегда будет соответствовать ей. В вашей строке вы можете избежать \n, например:

`line1
same\\nline2
line3`

Разделение на \n теперь даст:

 ["line1", "same\nline2", "line3"]

Имейте в виду, что теперь \n — это просто строка, а не новая строка, но вы можете отобразить этот массив и заменить его настоящей новой строкой.

["line1", "same\nline2", "line3"].map(value => value.replace(/\\n/g, "\n"))
person hsz    schedule 24.05.2018
comment
Вот этого я и опасался. Спасибо :-) - person alex3683; 24.05.2018
comment
Извините, изменен принятый ответ, так как это неожиданно решает мою проблему. - person alex3683; 24.05.2018