我正在用Java编写,并使用带有Eclipse的小黄瓜来搜索具有以下要求的类似IP的字符串
应接受以句点分隔的四位数序列 其中的数字顺序定义如下:任何一位数字,如果第一个字符非零,则任何两位数字字符,一个后跟零,一个或两个,后跟任意数字的一个]
通过在Stepdefs.java文件中编写适当的正则表达式,这就是我写的内容
@When("^test_ip_address ((?:(\\d)|(1[0-2]\\d)|([1-9]\\d))\\.){3}(?:(\\d)|([1-9]\\d)|(1[0-2]\\d))$")
public void test_ip_address(String arg1) throws Throwable {
System.out.println("test_ip_address true for: " + arg1);
}
现在,当我在Test.feature文件中为此方法编写测试(用Gherkin语言)时,第一个测试总是失败,测试(应该全部通过)
When test_ip_address 1.2.3.4
When test_ip_address 123.34.76.109
When test_ip_address 123.34.76.109
When test_ip_address 105.22.33.44
这不是价值问题,就像当我重新排序那些测试时,即使我在通过的另一项测试中使用了完全相同的值,也总是只有第一个失败!这是我得到的错误
cucumber.runtime.CucumberException: Arity mismatch: Step Definition 'skeleton.Stepdefs.test_ip_address(String) in file:(file path..)' with pattern [^test_ip_address ((?:(\d)|(1[0-2]\d)|([1-9]\d))\.){3}(?:(\d)|([1-9]\d)|(1[0-2]\d))$] is declared with 1 parameters. However, the gherkin step has 7 arguments [3., 3, null, null, 4, null, null]
我已经搜索了错误,并且当测试中的参数数量与方法中的参数数量不同时会抛出该错误,即使我使用(?:)将字符串作为一个参数传递,我也不会知道那7个论点从何而来!也不是错误原因
cucumber.runtime.CucumberException: Arity mismatch: Step Definition 'skeleton.Stepdefs.test_ip_address(String) in file:(file path..)' with pattern [^test_ip_address ((?:(\d)|(1[0-2]\d)|([1-9]\d))\.){3}(?:(\d)|([1-9]\d)|(1[0-2]\d))$] is declared with 1 parameters. However, the gherkin step has 7 arguments [3., 3, null, null, 4, null, null]
此错误是由于正则表达式具有7个组。捕获7个参数。和方法
public void test_ip_address(String arg1) throws Throwable
仅声明1个参数(arg1
)。
仅捕获一个参数,请使用non capturing group以避免捕获不必要的组作为方法参数。
表达式应该看起来像这样:
@When("^test_ip_address ((?:(?:(?:\\d)|(?:1[0-2]\\d)|(?:[1-9]\\d))\\.){3}(?:(?:\\d)|(?:[1-9]\\d)|(?:1[0-2]\\d)))$")
以下正则表达式应验证所有IPv4地址:
String zeroTo255 = "(\\d{1,2}|(0|1)\\" + "d{2}|2[0-4]\\d|25[0-5])";
String regex = zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255 + "\\." + zeroTo255;
改为使用此regex
变量。希望这回答了您的问题:)