最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - JSTS splitting string by a delimiter without removing the delimiter - Stack Overflow

programmeradmin2浏览0评论

I have a string that I need to split by a certain delimiter and convert into an array, but without removing the delimiter itself. For example, consider the following code:

var str = "#mavic#phantom#spark";
str.split("#") //["", "mavic", "phantom", "spark"]

I need the output to be as follows:

["#mavic", "#phantom", "#spark"]

I read here but that does not answer my question.

I have a string that I need to split by a certain delimiter and convert into an array, but without removing the delimiter itself. For example, consider the following code:

var str = "#mavic#phantom#spark";
str.split("#") //["", "mavic", "phantom", "spark"]

I need the output to be as follows:

["#mavic", "#phantom", "#spark"]

I read here but that does not answer my question.

Share Improve this question asked Aug 26, 2018 at 16:02 AlexAlex 2,0724 gold badges42 silver badges76 bronze badges 1
  • 2 You're not splitting (IMO), instead you're matching /#[^#]+/g. – Salman Arshad Commented Aug 26, 2018 at 16:22
Add a ment  | 

4 Answers 4

Reset to default 8

You could split by positive lookahead of #.

var string = "#mavic#phantom#spark",
    splitted = string.split(/(?=#)/);

console.log(splitted);

Split the string by # and use the reduce to return the modified string

var str = "#mavic#phantom#spark";
let x = str.split("#").reduce((acc, curr) => {
  if (curr !== '') {
    acc.push('#' + curr);
  }
  return acc;
}, [])
console.log(x)

Here is also some non-regexp methods of solving your task:

Solution 1 classical approach - iterate over the string and each time when we find indexOf our delimiter, we push to the result array the substring between current position and the next position. In the else block we have a case for the last substring - we simply add it to the result array and break the loop.

const delimiter = '#';
const result1 = [];
let i = 0;
while (i < str.length) {
  const nextPosition = str.indexOf(delimiter, i+1);
  if (nextPosition > 0) {
    result1.push(str.substring(i, nextPosition));
    i = nextPosition;
  } else {
    result1.push(str.substring(i));
    break;
  }
}

Solution 2 - split the initial string starting at index 1 (in order to not include empty string in the result array) and then just map the result array by concatenating the delimiter and current array item.

const result2 = str.substr(1).split(delimiter).map(s => delimiter + s);

another way: filter empty elements after splitting, and map these elements to start with the character you splitted with.

string.split("#").filter((elem) => elem).map((elem) => "#" + elem);
发布评论

评论列表(0)

  1. 暂无评论