Любые утверждения нулевой ширины внутри [...]
теряют смысл утверждения с нулевой шириной. [\b]
не соответствует границе слова (он соответствует обратному пространству, или в POSIX, \
или b
), [$]
соответствует буквенному символу $
, [^]
является либо ошибкой, либо, как в аромате регулярного выражения ECMAScript, любой символ. То же самое с \z
, \Z
, \A
якорями.
Вы можете решить проблему, используя любой из следующих шаблонов:
[&?]list=([^&]*)
[&?]list=(.*?)(?=&|$)
[&?]list=(.*?)(?![^&])
Паттерн .*?([YOUR_SINGLE_CHAR_DELIMITER(S)]|$)
, предложенный Жоау Силвой ) довольно неэффективен, так как механизм регулярных выражений проверяет шаблоны, которые появляются справа от шаблона ленивых точек, и только если они не совпадают, он «расширяет» шаблон ленивого точечного изображения.
В этих случаях рекомендуется использовать отрицательный класс символов (или выражение в разговоре POSIX):
[&?]list=([^&]*)
См. демонстрацию . Подробности
[&?]
- положительный класс символов, соответствующий либо &
, либо ?
(обратите внимание, что отношения между диапазонами символов / символов в классе символов являются отношениями OR) list=
- подстрока, последовательность символов ([^&]*)
- группа захвата # 1: ноль или более (*
) символов, отличных от &
([^&]
), столько, сколько возможно Большинство вариантов регулярных выражений (включая JavaScript, начинающиеся с ECMAScript 2018) поддерживают образы, конструкции, которые только верните true или false, если совпадение шаблонов или нет. Они имеют решающее значение в случае, если ожидаются последовательные совпадения, которые могут начинаться и заканчиваться одним и тем же символом (см. Исходный шаблон, он может соответствовать началу строки и заканчиваться на &
). Хотя это не ожидается в строке запроса, это обычный сценарий.
В этом случае вы можете использовать два подхода:
(?=[SINGLE_CHAR_DELIMITER(S)]|$)
(?![^SINGLE_CHAR_DELIMITER(S)])
Решение с отрицательным обзором немного более эффективно, потому что оно не содержит группу чередования, которая добавляет сложности к процедуре сопоставления. Решение OP будет выглядеть как
[&?]list=(.*?)(?=&|$)
или
[&?]list=(.*?)(?![^&])
. См. эту демонстрацию regex и другую здесь .
Конечно, в случае, если конечные разделители являются многочленными последовательностями, будет работать только положительное обратное решение, поскольку [^yes]
не отменяет последовательность символов, но символы внутри класса (т.е. [^yes]
соответствуют любому char, но y
, e
и s
).
Это вернет все возвраты в html.
str = str.replace(/(?:\r\n|\r|\n)/g, '<br>');
Если ваша проблема только показывает разрывы строк, вы можете сделать это с помощью CSS.
HTML
<div class="white-space-pre">Some test
with linebreaks</div>
CSS
.white-space-pre {
white-space: pre-wrap;
}
jsfiddle https://jsfiddle.net/yk1angkz/125/
Примечание. Обратите внимание на форматирование и отступы кода, поскольку white-space: pre-wrap
отобразит все пробелы (за исключением последней строки новой строки после текст, см. скрипку).
white-space: pre-wrap;
я предпочитаю использовать white-space: pre-line;
(чтобы не добавлять окончательную строку прерывания)
– jpmottin
9 August 2016 в 17:54
Также важно кодировать остальную часть текста, чтобы защитить от возможных атак сценария
function insertTextWithLineBreaks(text, targetElement) {
var textWithNormalizedLineBreaks = text.replace('\r\n', '\n');
var textParts = textWithNormalizedLineBreaks.split('\n');
for (var i = 0; i < textParts.length; i++) {
targetElement.appendChild(document.createTextNode(textParts[i]));
if (i < textParts.length - 1) {
targetElement.appendChild(document.createElement('br'));
}
}
}
Это работало для меня, когда значение пришло из TextBox:
string.replace(/\n|\r\n|\r/g, '<br/>');
Если принятый ответ не подходит для вас, вы можете попробовать.
str.replace(new RegExp('\n','g'), '<br />')
Это сработало для меня.
new RegExp('\n', 'g')
идентичен /\n/g
(за исключением некоторых мелочей об использовании примитивных литералов и их конструкторов).
– eyelidlessness
10 March 2013 в 11:37
/\n/g
как строку!
– Daniel Fortunov
15 March 2013 в 17:26
, если вы отправляете переменную из PHP, вы можете получить ее с этим перед отправкой:
$string=nl2br($string);
Для тех из вас, кто просто хочет разрешить макс. 2 <br>
в строке, вы можете использовать это:
let text = text.replace(/(\r?\n){2,}/g, '<br><br>');
text = text.replace(/(\r?\n)/g, '<br>');
Первая строка: Ищите \n
ИЛИ \r\n
, где по меньшей мере 2 из них находятся в строке, например. \n\n\n\n
. Затем замените его на 2 br
Вторая строка: найдите все одиночные \r\n
или \n
и замените их на <br>
Независимо от системы:
my_multiline_text.replace(/$/mg,'<br>');
Без регулярного выражения:
str = str.split("\n").join("<br />");
\\n
не соответствует новой строке, потому что он ищет backslash
+ n
.
– paulslater19
3 August 2012 в 09:04
Это работает для ввода, поступающего из текстового поля
str.replace(new RegExp('\r?\n','g'), '<br />');
str.replace("\n", '<br />')
(первый аргумент является обычной строкой) заменит только первое вхождение. – Serge S. 15 April 2013 в 21:49String#replace
принуждает свой первый аргумент изString
к экранированному экземпляруRegExp
без флажков.str.replace('\n', '<br />');
эквивалентноstr.replace(new RegExp('\n'), '<br />');
– eyelidlessness 19 January 2014 в 09:37\r?\n
неверен. Некоторые другие системы используют только\r
. Я буду обновлять все случаи. – eyelidlessness 19 May 2014 в 20:59