4

我正在尝试创建一个匹配以下内容的正则表达式:

Given I'm a user
Given I am a user
Given Dylan is a user

这是我的步骤定义:

@Given("^(?:(I)'m|(I) am|(.+) is) a user$")
public void aUserExists(String username) throws Throwable {
}

它符合我的需要,但似乎 Cucumber 正在尝试将非捕获组中的每个捕获组分配给一个参数,而我希望它只分配一个:

cucumber.runtime.CucumberException: Arity mismatch: Step Definition 'hello.MyStepdefs.aUserExists(String) in [...] with pattern [^(?:(I)'m|(I) am|(.+) is)一个 user$] 用 1 个参数声明。但是,小黄瓜步骤有 3 个参数 [I, null, null]。

我来自 PHP 背景,这个正则表达式与Behat配合得很好。也许我对 Java 正则表达式或 Cucumber 行为一无所知。


更新

由于所有当前答案都存在相同的问题,因此我正在更新问题。

我不想匹配这样的字符串:

Given I is a user

我只想I在它后面跟着'mor时匹配am。我希望用 Java 正则表达式和 Cucumber 来做这件事不是一件不可能的事情。

4

3 回答 3

2

我不确定这是否是您要查找的内容,但是如果您想在第一组中捕获用户名而不创建更多组,那么可以尝试

"^(\\w+)(?:(?<=I\\b)(?:'m| am)|(?<!^I\\b) is) a user$"
于 2013-12-07T22:49:36.417 回答
1

您可以重写正则表达式以仅使用一个捕获组,尽管它变得很难看:

@Given("^(I(?='m| am)|.+(?= is))(?:'m| am| is) a user$")
于 2013-12-07T22:44:43.547 回答
1

Arity mismatch:与您的正则表达式无关,而是您的Given I'm a user行与您的方法签名不匹配public void aUserExists(String username) throws Throwable { }取出字符串参数并重试。

于 2016-12-09T19:03:17.613 回答