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

后端 未结 3 1633
一向
一向 2020-12-10 19:25

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

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

Am

3条回答
  •  臣服心动
    2020-12-10 20:20

    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
    

提交回复
热议问题