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

WireMock JsonPath如何使用正则实现过滤条件取反

WireMock JsonPath实现非10位纯数字字段的stub匹配

背景

  • 基于WireMock开展接口桩(stub)配置,WireMock的JSON路径匹配底层依赖Jayway JsonPath实现
  • 目标匹配规则:仅当请求JSON中的employeeContact字段值不恰好为10位纯数字时,命中对应stub

现有方案问题

当前使用的stub配置片段如下:

"request": {
    "bodyPatterns": [
      {
        "matchingJsonPath": "$.employees[?(@.employeeContact =~/[^0-9]{10}/)]"
      }
    ]
  }

先后尝试4种JsonPath正则写法,均未实现预期效果:

1. $.employees[?(@.employeeContact =~/[^0-9]{10}/)]
2. $.employees[?(@.employeeContact =~/^[0-9]{10}/)]
3. $.employees[?(@.employeeContact !=~/[0-9]{10}/)]
4. $.employees[?(@.employeeContact <>~/[^0-9]{10}/)]

匹配规则明细

  • 不应命中场景:employeeContact为正好10位纯数字,请求示例:
{
"employee": {
    "employeeContact": "1234567890"
}
}
  • 应当命中场景:所有非10位纯数字的取值,包含但不限于以下类型:
1. "employeeContact": "1a34567890"  // 中间包含非数字字符
2. "employeeContact": "12345678901" // 长度超过10位
3. "employeeContact": "123456789"   // 长度不足10位
4. "employeeContact": "123456 89"   // 包含空格

原有写法错误点

  1. JsonPath路径错误:示例请求中employeeContact是employee对象下的直接字段,不是employees数组下的子元素,原路径$.employees[?...]无法定位到目标字段
  2. 正则逻辑错误:[^0-9]{10}语义为「连续10个非数字字符」,和需求完全不符;且未加^/$首尾锚点时,正则为子串匹配,无法校验整个字段值的长度和字符规则
  3. 语法不支持:Jayway JsonPath不支持!=~、<>~这类正则取反运算符,这类写法本身会被解析器判定为无效表达式

正确实现方案

推荐写法(可读性更高)

拆分字段定位和值校验逻辑,先用JsonPath定位到目标字段,再用WireMock原生的正则匹配做值校验,避免在JsonPath中写复杂内联正则:

"request": {
    "bodyPatterns": [
      {
        "matchingJsonPath": "$.employee.employeeContact",
        "matches": "^(?!^\\d{10}$).*$"
      }
    ]
  }

正则^(?!^\\d{10}$).*$语义说明:

  • 从字符串起始位置做负向预判,排除「从头到尾恰好为10位数字」的情况
  • 匹配其余所有长度、字符组合的字符串,完全覆盖需要命中的场景

内联正则写法(必须在JsonPath内写正则时使用)

修正JsonPath路径,搭配带首尾锚点和负向断言的正则即可:

"request": {
    "bodyPatterns": [
      {
        "matchingJsonPath": "$.employee.employeeContact =~ /^(?!^[0-9]{10}$).*$/"
      }
    ]
  }

两种写法都可以准确实现规则:10位纯数字的请求不会命中stub,其余所有取值都会正常命中。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 01:45:45