You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python和正则从JavaScript步骤定义中提取正则与函数代码?

解析Gherkin步骤定义:提取正则与函数代码的实用方案

一、别用正则硬匹配大括号,坑太多

纯正则根本搞不定JavaScript的语法上下文——函数里嵌套大括号、字符串/注释里的大括号都会让匹配彻底失效,完全靠不住。

二、用AST解析才是正解(首选方案)

直接用JS语法解析库把代码转成抽象语法树(AST),精准定位步骤定义的函数:

  • 主流库选@babel/parser或者acorn,搭配遍历工具@babel/traverse就能轻松提取内容
  • 步骤定义都是Given/When/Then这类函数调用,第一个参数是正则,第二个就是回调函数
  • 示例代码:
    const parser = require('@babel/parser');
    const traverse = require('@babel/traverse').default;
    const generate = require('@babel/generator').default;
    
    // 示例步骤定义代码
    const stepCode = `Given(/^I have (\\d+) items in the cart$/, function() {
      const count = parseInt(arguments[0]);
      if (count > 0) {
        console.log('Cart has items');
      }
    });`;
    
    // 解析代码生成AST
    const ast = parser.parse(stepCode, { sourceType: 'script' });
    
    // 遍历AST节点
    traverse(ast, {
      CallExpression(path) {
        const callee = path.node.callee.name;
        // 定位Given/When/Then调用
        if (['Given', 'When', 'Then'].includes(callee)) {
          // 提取正则表达式内容
          const regexPattern = path.node.arguments[0].pattern;
          // 提取并生成函数代码
          const funcAstNode = path.node.arguments[1];
          const funcCode = generate(funcAstNode).code;
    
          console.log('匹配正则:', regexPattern);
          console.log('对应函数代码:', funcCode);
        }
      }
    });
    
  • 这种方式能完美处理所有语法场景,不管嵌套多少层大括号、有没有特殊字符,都能精准提取。

三、专用工具库(针对Cucumber场景)

如果是处理Cucumber的步骤定义,还可以结合cucumber-expressions库——它专门负责解析Cucumber的步骤匹配规则,再搭配AST解析就能一站式搞定正则和函数代码的提取。

四、极端简单场景下的正则权宜之计

如果你的步骤定义函数完全没有嵌套大括号、字符串/注释里也没大括号,那可以试试这个正则(但强烈不推荐用于复杂代码):

(Given|When|Then)\(/(.*?)/,\s*(function.*?\{([\s\S]*?)\})\);

但只要代码稍微复杂一点,这个正则就会直接失效,别抱太大期望。

内容的提问来源于stack exchange,提问作者Uncle Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:07:11