如何用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
相关产品推荐
相关产品推荐

