Применить метод Split к строке и вернуть массив, который сожержит разделители как отдельные элементы
Можно ли каким-то образом разделить строку "#hello This is an #example of some text with #hashtags and this #hashtags" методом Split на части и получить такой результат:
res = ['#hello',' This is an ','#example', ' of some text with ', '#hashtags', ' and this ', '#hashtags']
Делить пытаюсь по словам, перед которыми есть "#", используя это регулярное выражение:
regex = /(#[A-Za-z0-9]+)/gm
Ответы (2 шт):
Можно использовать .match(regex)
let str = "#hello This is an #example of some text with #hashtags and this #hashtags moo";
let regex = /(#[A-Za-z0-9]+)|(.+?(?=(#|$)))/gm;
console.log( str.match(regex) );
Находит слова, начинающиеся на #, или | любой символ . один или много раз + до тех пор, пока не попадется новая решетка или конец строки (?=(#|$)) — называется 'positive lookahead'.
Касаемо более универсального варианта... Кажется без переборов не обойтись:
let str = "#hello This is an #example of some text with #hashtags and this #hashtags moo";
let arr = splitInclude(str, /#[A-Za-z0-9]+/gm);
console.log( arr );
/***/
function splitInclude(str, regex) {
var match = str.match(regex);
if( match === null ) return [str];
var result = [];
var lastIndex = 0;
for( var i = 0; i < match.length; i++ ) {
var index = str.indexOf( match[i], lastIndex );
result.push( str.slice(lastIndex, index) );
result.push( match[i] );
lastIndex = match[i].length + index;
}
if( str.length > lastIndex ) result.push( str.slice(lastIndex) );
if( ! result[0] ) result.shift();
return result;
}
Все оказалось проще простого, главное быть повнимательнее. Использование регулярного выражения в скобках в методе Split возвращает массив, который имеет все нужные значения и лишние пустые строки. Поэтому так можно решить эту задачу:
let str = "#hello This is an #example of some text with #hashtags and this #hashtags";
let arr = str.split(/(#[A-Za-z0-9]+)/gm).filter(el => el);
console.log(arr);