Применить метод 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 шт):

Автор решения: OPTIMUS PRIME

Можно использовать .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;
}

→ Ссылка
Автор решения: Friendly 33

Все оказалось проще простого, главное быть повнимательнее. Использование регулярного выражения в скобках в методе 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);

→ Ссылка