Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JS Regex to match everything inside braces (including nested braces): "{ I want this {and this} and this in one string }"

Meaning that I simply want to strip the enclosing braces. I can match "{ this kind of stuff }" with:

"{stuff}".match(/{([^}]*)}/)[1]

Am I asking too much here?

Another example, I've got this javascript code as string:

{
    var foo = {
        bar: 1    
    };

    var foo2 = {
        bar: 2    
    };
}

I want to strip only the outside braces:

var foo = {
    bar: 1
};

var foo2 = {
    bar: 2
}
like image 201
uɥƃnɐʌuop Avatar asked Dec 27 '22 06:12

uɥƃnɐʌuop


1 Answers

Try this (I based my code on this answer). It also knows to ignore brackets in strings and comments (single-line and multi-line) - as noted in the comment section of that answer:

var block = /* code block */
    startIndex = /* index of first bracket */,
    currPos = startIndex,
    openBrackets = 0,
    stillSearching = true,
    waitForChar = false;

while (stillSearching && currPos <= block.length) {
  var currChar = block.charAt(currPos);

  if (!waitForChar) {
    switch (currChar) {
      case '{':
        openBrackets++; 
        break;
      case '}':
        openBrackets--;
        break;
      case '"':
      case "'":
        waitForChar = currChar;
        break;
      case '/':
        var nextChar = block.charAt(currPos + 1);
        if (nextChar === '/') {
          waitForChar = '\n';
        } else if (nextChar === '*') {
          waitForChar = '*/';
        }
    }
  } else {
    if (currChar === waitForChar) {
      if (waitForChar === '"' || waitForChar === "'") {
        block.charAt(currPos - 1) !== '\\' && (waitForChar = false);
      } else {
        waitForChar = false;
      }
    } else if (currChar === '*') {
      block.charAt(currPos + 1) === '/' && (waitForChar = false);
    }
  }

  currPos++ 
  if (openBrackets === 0) { stillSearching = false; } 
}

console.log(block.substring(startIndex , currPos)); // contents of the outermost brackets incl. everything inside
like image 85
pilau Avatar answered Feb 15 '23 09:02

pilau