You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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正则本身不匹配空字符串,因此触发报错。

有两种解决方式:

  1. 修改正则表达式,添加匹配空字符串的规则,比如在正则末尾追加|^$,示例:
    * def ipV6AddressCheck = '#regex^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|...)|^$'
    
    (保留原有正则逻辑,仅在末尾添加|^$即可)
  2. 在匹配步骤中显式处理空字符串场景,示例:
    * match emptyRegexResponse == '' || emptyRegexResponse == '##(ipV6AddressCheck)'
    

内容的提问来源于stack exchange,提问作者mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:05:01