JavaScript RegEx获取测试规范

JavaScript RegEx to get test spec

本文关键字:测试 获取 RegEx JavaScript      更新时间:2023-09-26

使用Jasmine时,我需要获取插入符号所在的当前测试规范。所以,如果我有一个规范,比如:

it("should do something", function() {
    var foo = 'bar';
    expect(foo).toEqual('bar');
});

我在空行中有插入符号,我单击UI中的某个按钮,它应该从插入符号返回以找到规范。所以它转到var foo = 'bar';行,检测到它不匹配,所以转到具有it()的下一行,因此发现该行是规范。所以我可以逐行返回,但检测它是否是包含it()的行是我需要帮助的。

我的最终情况是检测作为第二个参数传递的function()中是否有参数。如果没有,我需要在里面加一个。因此,由于上面的代码段在function()中没有参数,所以我需要添加一个,使其看起来像:

it("should do something", function(done) {
    var foo = 'bar';
    expect(foo).toEqual('bar');
});

请注意现在function()中的done。此外,"should do something"可以是双引号或单引号,并且可以包含任何合法的JavaScript字符

作为测试,我使用了RegEx:

/^'s*it'((?:"|')['w's]+(?:"|'), function'((?:'w+)?') {/

它适用于我的简单测试,但感觉不完整,尤其是在"should do something"检测部分。

我认为您可以安全地使用基于展开循环方法的正则表达式:

^'s*it'([^,]*(?:,(?!'s*function'()[^,]*)*,'s*function'('w*')'s*{

它在一个字符串的开头匹配it(,后面是任何不是, function(的内容,然后是, function(...) {^'s*it'(['s'S]*?,'s*function'('w*')'s*{的同义词,但表达效率高得多。

查看regex演示

现在,如果您需要在function()中不包含任何文本的情况下匹配这样的签名,您可以使用要保留的子模式周围的捕获组,稍后可以将其引用为$1$2:

var re = /^('s*it'([^,]*(?:,(?!'s*function'()[^,]*)*,'s*function'()(')'s*{)/; 
var str = 'it("should do something", function() {'n    var foo = ''bar'';'n'n    expect(foo).toEqual(''bar'');'n});';
var subst = '$1done$2'; 
var result = str.replace(re, subst);
document.write(result);

如果你真的可以像Oriol建议的那样使用wierd字符串,请使用

^'s*it'((?:"[^"'']*(?:''.[^"'']*)*"|'[^''']*(?:''.[^''']*)*'),'s*function'('w*')'s*{

查看另一个regex演示

它将匹配

it(",function(){", function() {
it(',function(){', function() {