JSFiddle - React, Tailwind, and code Playground
HTML
<textarea id="in" rows="10">{ abc }
{ a { bc } }
{ a {{}} }
{ abc {efg}{hij}}
{ a b cde }{aa}
{{}
} equal number of curly braces {
{ print "Went there {" } /* } { Dang edge cases! } */
{ a }//{b} commented out
{ "{" } { '}' }</textarea>
<textarea id="out" rows="10"></textarea>
CSS
textarea {
width:100%;
}
JavaScript
var rows = document.getElementById('in').value.split('\n');
for (var n = 0; n < rows.length; n++) {
var r = rows[n].replace(/(['"])(?:(?!\1|\\).|\\.)*\1|\/(?![*/])(?:[^\\/]|\\.)+\/[igm]*|\/\/[^\n]*(?:\n|$)|\/\*(?:[^*]|\*(?!\/))*\*\//gi, '');
if (r.split('{').length != r.split('}').length || r.indexOf('}') < r.indexOf('{')) {
document.getElementById('out').value += 'ERROR\t' + rows[n] + '\n';
continue;
}
while (r.match(/\{[^}]*\{[^{}]*\}/))
r = r.replace(/(\{[^}]*)\{[^{}]*\}/g, '$1');
if (r.match(/\}.*\{/))
document.getElementById('out').value += 'FALSE\t' + rows[n] + '\n';
else
document.getElementById('out').value += 'TRUE\t' + rows[n] + '\n';
}