DEV Community

Cover image for The fastest way to find closing brackets
Eckehard
Eckehard

Posted on

The fastest way to find closing brackets

Recently I stumbled across the problem to find pairs of brackets in a string. A simple solution could be:

 let s = "the quick { brown } { fox } jumps" let ar = s.split("}").map((t,i,ar) => (i<ar.length-1) ? t+"}" : t ) console.log(ar) 
Enter fullscreen mode Exit fullscreen mode

This gives us a nice result, which was ok in my case:

0: 'the quick { brown }'
1: ' { fox }'
2: ' jumps'

This works, but fails for nested brackets. So, how can we deal with paired brackets? If we are evaluating strings on a character basis, we can implement some kind of fancy recursion, but this tends to be slow.

Here is my solution:

let s, tmp, part = '', ar = [] s = "the quick { brown { fox }} jumps" // split and restore brackets, last element has not bracket!  tmp = s.split("}").map((t, i, ar) => (i < ar.length - 1) ? t + '}' : t) // fill the result array 'ar' tmp.forEach((t) => { // set or extend part part = (part === '') ? t : part + t // find pairs if (part.split('{').length === part.split('}').length) { // equal number of brackets? ar.push(part.trim()) // => push out part = '' } }) console.log(ar) 
Enter fullscreen mode Exit fullscreen mode

part.split('{').length gives us the number of brackets + 1, so it is easy to compare the number of opening and closing brackets. This gives us the desired result

0: 'the quick { brown { fox }}'
1: 'jumps'

If you have any better way to evaluate pairing brackets, please let me know!

Hint: Solutions based on regEx are usually much slower on JS!

Top comments (0)