使用 RegEx 和 Python 从 JavaScript 函数中提取代码

问题描述 投票:0回答:1

我目前正在解析一些 Gherkin 文件及其关联的步骤定义文件。我想知道提取步骤中的正则表达式以及代码的最佳方法是什么。例如我有以下功能:

this.Given(/^I create an SNS topic with name "([^"]*)"$/, function(name, callback) {
    var world = this;
    this.request(null, 'createTopic', {Name: name}, callback, function (resp) {
      world.topicArn = resp.data.TopicArn;
    });
  });

  this.Given(/^I list the SNS topics$/, function(callback) {
    this.request(null, 'listTopics', {}, callback);
  });

我想提取正则表达式

^I create an SNS topic with name "([^"]*)"$
和函数代码:

    var world = this;
    this.request(null, 'createTopic', {Name: name}, callback, function (resp) {
      world.topicArn = resp.data.TopicArn;
    });

我已经能够使用以下正则表达式提取正则表达式:'this.(?:Given|Then|When)(/(.+?)/'

但是,提取功能代码要棘手得多。如何指定提取函数从第一个 { 到最后一个 } 的所有内容?有没有更好的方法来做到这一点,即自动提取它的库?

javascript python regex cucumber gherkin
1个回答
0
投票

正则表达式不适合正确解析通用程序(1)。您应该使用 javascript 解析器。

另一种方法是选择代理;例如:

  • 您可以将文件分成以
    this.Given(
    ,
  • 开头的行块
  • 保留您在块中看到的
    this.Given(
    和最后一个
    });
    之间的任何内容作为“函数体”

这种简单化的方法有一些明显的盲点(这就是为什么我称其为“代理”):
如果您碰巧有嵌套的

this.Given(
语句,它将不起作用,它会错误地在注释行中捕获最终的
});
,它会错误地包含另一个函数声明中的代码(如果您碰巧有一些声明的代码) 两个
this.Given(
语句之间),...

但是如果您的代码具有常规结构,这可能比使用完整的 javascript 解析器更快地实现。


(1) : 编程语言通常属于“上下文无关”或“上下文敏感”语言类别,而正则表达式只能解析“常规”语言

© www.soinside.com 2019 - 2024. All rights reserved.