SpecFlow C#中带双引号的可选参数正则表达式步骤定义问题
搞定SpecFlow可选参数的步骤定义
嘿,我来帮你解决这个SpecFlow步骤匹配的问题!你的需求是让三个带不同参数数量的Given I do步骤共用一个定义,而且最后两个带引号的参数是可选的对吧?咱们一步步来理清楚。
先说说你之前尝试的问题在哪
你写的几个正则主要踩了这几个坑:
- 用
.*会触发贪婪匹配,容易把后面的逗号、引号也误抓到参数里,导致匹配混乱 - 可选分组的结构没搭对,没有把“逗号+空格+完整参数”作为一个整体标记成可选
- 有些写法里把引号弄成可选了(比如
""?),这显然不符合你带引号参数的需求
正确的写法来了!
下面这个正则和步骤定义能完美适配你所有的场景,还能避免贪婪匹配的问题:
[Given(@"I do ""([^""]*)""(?:, ""([^""]*)""(?:, ""([^""]*)""))?")] public void GivenIDo(string requiredParam, string? optionalParam1 = null, string? optionalParam2 = null) { // 这里写你的业务逻辑就行,比如打印参数看看效果: Console.WriteLine($"必填参数:{requiredParam}"); if (optionalParam1 != null) Console.WriteLine($"可选参数1:{optionalParam1}"); if (optionalParam2 != null) Console.WriteLine($"可选参数2:{optionalParam2}"); }
给你拆解下这个正则的逻辑
""([^""]*)"":这部分匹配必填的带引号参数,[^"]*是关键——它只匹配引号以外的任意字符,既不会贪婪地抓到后面的引号和逗号,还能保留参数里的空格(比如你例子里的"y "和" z"里的空格都能完整保留)(?:, ""([^""]*)""(?:, ""([^""]*)""))?:整个这一块是一个可选的非捕获组(?:表示不生成多余的分组,避免干扰参数匹配):- 内层先把“逗号+空格+第二个参数”做成一个小的可选组,然后再嵌套第三个参数的可选组,这样就保证了:只有当第二个参数存在时,第三个参数才会被匹配,完全符合你的步骤结构
- 最后的
?标记整个这部分可以出现0次(对应只有必填参数的情况)、1次(对应两个或三个参数的情况)
验证下效果哦
这个定义能完美匹配你给出的三个步骤:
Given I do "x"→ 只有requiredParam是"x",另外两个可选参数都是nullGiven I do "x", "y "→requiredParam="x",optionalParam1="y ",optionalParam2=nullGiven I do "x", "y ", " z"→ 三个参数都能正确捕获,包括里面的空格
内容的提问来源于stack exchange,提问作者Razkar
相关产品推荐
相关产品推荐

