我目前正在解析一些 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)(/(.+?)/'
但是,提取功能代码要棘手得多。如何指定提取函数从第一个 { 到最后一个 } 的所有内容?有没有更好的方法来做到这一点,即自动提取它的库?
正则表达式不适合正确解析通用程序(1)。您应该使用 javascript 解析器。
另一种方法是选择代理;例如:
this.Given(
,this.Given(
和最后一个 });
之间的任何内容作为“函数体”这种简单化的方法有一些明显的盲点(这就是为什么我称其为“代理”):
如果您碰巧有嵌套的
this.Given(
语句,它将不起作用,它会错误地在注释行中捕获最终的 });
,它会错误地包含另一个函数声明中的代码(如果您碰巧有一些声明的代码) 在两个this.Given(
语句之间),...
但是如果您的代码具有常规结构,这可能比使用完整的 javascript 解析器更快地实现。
(1) : 编程语言通常属于“上下文无关”或“上下文敏感”语言类别,而正则表达式只能解析“常规”语言