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)