matchEachEmptyAllowed与Regex配合时空值匹配失效问题咨询
问题
已配置matchEachEmptyAllowed = true并使用##可选标记,但空字符串无法通过IPv6正则校验,而null值可正常通过,请问是配置遗漏还是已知问题?
测试代码
Feature: Background: * configure matchEachEmptyAllowed = true * configure continueOnStepFailure = true * def ipV6AddressCheck = '#regex^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))' * def regexResponse = "2600:6ce1:0:26:83f:d32a:f426:92e3" * def emptyRegexResponse = "" * def nullRegexResponse = null Scenario: * match regexResponse == '##(ipV6AddressCheck)' * match emptyRegexResponse == '##(ipV6AddressCheck)' * match nullRegexResponse == '##(ipV6AddressCheck)'
报错信息
>>> failed features: match failed: EQUALS $ | regex match failed (STRING:STRING) '' '#regex^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))'
回答
这是Karate框架的预期行为,不是配置遗漏:
matchEachEmptyAllowed = true仅针对数组场景生效,允许数组中空元素通过校验,对单个字符串空值不产生作用。##可选标记的逻辑是:被校验值为null时直接通过,但如果是空字符串,仍会执行后续的正则匹配。你的IPv6正则本身不匹配空字符串,因此触发报错。
有两种解决方式:
- 修改正则表达式,添加匹配空字符串的规则,比如在正则末尾追加
|^$,示例:
(保留原有正则逻辑,仅在末尾添加* def ipV6AddressCheck = '#regex^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|...)|^$'|^$即可) - 在匹配步骤中显式处理空字符串场景,示例:
* match emptyRegexResponse == '' || emptyRegexResponse == '##(ipV6AddressCheck)'
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

