【问题标题】:Regex for matching everything inside a function curly braces用于匹配函数花括号内的所有内容的正则表达式
【发布时间】:2018-08-20 17:23:37
【问题描述】:

我找到了很多匹配嵌套括号内内容的正则表达式示例,但我想做的是匹配:

  • 具有特定名称的函数
  • 匹配大括号内的所有内容(包括任何嵌套的大括号)

例如:

function someFunc() {
  const a = 6;

  if (a === 7) {
    while (true) {
      break;
    }
  }
}

这应该会找到function someFunc+ignore 任何内容,直到第一个花括号+然后匹配花括号内的所有内容,包括任何嵌套的花括号。

我是 regex 的菜鸟,所以我不能告诉你我做了什么,我一直在看 Regex to get string between curly braces "{I want what's between the curly braces}" 但它们都不合适。谢谢!

PS 预期输出是一个函数中所有内容的捕获组(然后我可以替换它)。

【问题讨论】:

  • 计算括号对于正则表达式的要求太高了,除非您使用将它们扩展到常规语法可能性之外的奇异特性(这在 javascript 中可能不存在)
  • 我不太清楚这个输入的预期结果是什么 - 你能澄清一下吗?
  • 这样的东西更适合使用解析器。有很多好的解析器引擎,例如。 https://pegjs.org/ 实际上你的解析是 Javascript,你甚至可以使用 Babel,它已经为你解决了所有的 AST。
  • JS 引擎不支持递归。所以你不能在JS中做到这一点。
  • 正则表达式只对regular languages有用。 JavaScript 是 not a regular language

标签: javascript regex


【解决方案1】:

我为此做了一个非常幼稚的函数(因为这就是我所需要的,因为我知道函数的内容是什么样的):

function loader(content, functionName) {
  // Find function
  const indexOfFunc = content.indexOf(`function ${functionName}`);

  if (indexOfFunc < 0) {
    return content;
  }

  const openingBrace = content.indexOf('{', indexOfFunc);

  // WARNING: We are assuming all braces in the function are balanced.
  // This won't be the case if there are braces in strings or comments
  // which aren't!
  const startPos = openingBrace + 1;
  let endPos = startPos;
  let bracesToBalance = 1;

  while (true) {
    if (content[endPos] === '{') {
      bracesToBalance++;
    } else if (content[endPos] === '}') {
      bracesToBalance--;
      if (bracesToBalance === 0) break;
    }
    endPos++;
  }

  return content.slice(0, startPos) + content.slice(endPos);
};

【讨论】:

    【解决方案2】:

    也许这有帮助?

    functionName\(.*{(.|\n)*}\n{2,}
    

    这将搜索一个名为 functionName 的函数,后跟一个左括号,并将获取所有内容,直到找到一个右大括号,后跟两个或多个换行符。

    这是一个 Regex101 来测试它。

    https://regex101.com/r/BadtRu/3

    【讨论】:

    • 谢谢,这个函数之后只有 1 个换行符,我无法更改,但好主意
    • 所有函数都跟在另一个函数后面吗?在这种情况下,在正则表达式的末尾添加function(并删除{2,}
    • 后面是另一个,而且里面还有三个使用'function'关键字的嵌套函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2018-01-21
    • 1970-01-01
    • 2020-01-20
    相关资源
    最近更新 更多