JavaScript RegEx 用于获取测试规范

标签 javascript regex

我需要获取使用 Jasmine 时我的插入符所在的当前测试规范。因此,如果我有这样的规范:

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

    expect(foo).toEqual('bar');
});

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

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

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

    expect(foo).toEqual('bar');
});

注意现在 function() 中的done。此外,“应该做某事” 可以是双引号或单引号,并且可以包含任何合法的 JavaScript 字符。

作为测试,我使用了这个正则表达式:

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

它适用于我的简单测试,但感觉不完整,尤其是在“应该做某事”检测部分。

最佳答案

我认为您可以安全地使用基于 unroll-the-loop method 的正则表达式:

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

它匹配字符串开头的 it( ,后跟任何不是 , function( 的内容,然后是 , function(...) { . 一个 ^\s*it\([\s\S]*?,\s*function\(\w*\)\s*{ 的同义词,但是更有效的表达。

请参阅regex demo

现在,如果您需要匹配此类签名,而 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 建议的那样拥有如此奇怪的字符串,请使用

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

参见another regex demo

它会匹配

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

关于JavaScript RegEx 用于获取测试规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34007256/

相关文章:

javascript - Node.js URL POST 重写

javascript - 通过谷歌的 API 检索谷歌分析的行为流?

javascript - jquery 数字计数到目标数字

javascript - 使用 JavaScript 进行电子邮件验证

javascript - Mediaelement.js:如何更改海报图片?

javascript - `/REG/g` 和 `new RegExp()` 之间有不同的行为吗?

java正则表达式量词

python - 匹配一个单词,后跟任意顺序的两个可选组

php - 如何拆分逗号后面没有空格的字符串?

c# - .NET正则表达式:内联大小写不起作用