Ответ 1
Что вам нужно, это регулярное выражение, которое будет соответствовать альтернативам и будет отображать только в первой группе, которая представит умеренный жадный токен (или развернутая версия для лучшей производительности - если у вас есть только 2 или 3):
&|((?:(?!&)[\s\S])+)
Смотрите демонстрацию regex (развернутая версия - &|([^&]*(?:&(?!amp;)[^&]*)*)
Образец:
-
&
- соответствует&
entity -
|
- или -
((?:(?!&)[\s\S])+)
- сопоставляет и фиксирует в группу 1 любой фрагмент текста (1+ символов), который не является отправной точкой для последовательности&
. Так как это для JS, вам нужен[\s\S]
(или[^]
) для соответствия любому символу, включая новую строку. В противном случае используйте.
вместо этого (если вы только собираетесь сопоставлять строки).
var re = /&|((?:(?!&)[\s\S])+)/g;
var str = 'abc Ben & Jerry\ foobar ssss sss sss &\n\n\nsssss&sssss &\n\nsssss&sssss &sssss\n&sssss&\n&&';
var res = [];
while ((m = re.exec(str)) !== null) {
if (m.index === re.lastIndex) {// A part of code only necessary for the
re.lastIndex++; // unrolled pattern (as it can match empty string)
}
res.push(m[1]); // Only collect the captured texts
}
document.body.innerHTML = "<pre>BEFORE:<br/>" + str.replace(/&/g, '&') + "</pre>";
document.body.innerHTML += "<pre>AFTER:<br/>" + res.join("") + "</pre>";