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" // 包含空格
原有写法错误点
- JsonPath路径错误:示例请求中
employeeContact是employee对象下的直接字段,不是employees数组下的子元素,原路径$.employees[?...]无法定位到目标字段 - 正则逻辑错误:
[^0-9]{10}语义为「连续10个非数字字符」,和需求完全不符;且未加^/$首尾锚点时,正则为子串匹配,无法校验整个字段值的长度和字符规则 - 语法不支持: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
相关产品推荐
相关产品推荐

