I’m trying to split a string by curly brackets but ignore nested brackets. E.g given the following:
hello {world} this is some text. {split me {but not me} thanks} heaps!
split into:
[ 'hello ', '{world}', 'this is some text. ', '{split me {but not me} thanks}', ' heaps!' ]
Any help would be appreciated!
This is what I have so far:
const result = []; let current = ''; let stack = 0; for (let i = 0; i < str.length; i++) { var ch = str[i]; current += ch; if (ch.trim() === '') { continue; } if (ch === '{') { stack++; } else if (ch === '}') { stack--; } if (ch === '}' && stack <= 0) { result.push(current); current = ''; } } result.push(current);
Advertisement
Answer
You have all the logic in your attempt, you just need to reorder a little and push to the results array.
Here’s a quick working snippet. It can probably be cleaned up or condensed a little, but a way forward at least.
const str = 'hello {world} this is some text. {split me {but not me} thanks} heaps!'; const result = []; let current = ''; let stack = 0; for (let i = 0; i < str.length; i++) { if (str[i] === '{') { if (!stack) { result.push(current); current = '' } stack++; } current += str[i]; if (str[i] === '}') { stack--; if (!stack) { result.push(current); current = '' } } } if (current.length) { result.push(current); } console.log(result)