WireMock含负向预查的正则匹配失败问题排查
WireMock 2.33.2 负向预查正则路径匹配失败问题解决
问题根源
你遇到的核心问题有两个:
- 正则转义错误:在JSON配置中错误转义了负向预查的
?符号,导致Java正则引擎将其解析为字面量?,而非负向预查语法。 - 正则引擎差异:regex101默认使用PCRE引擎,而WireMock基于Java的
java.util.regex引擎,语法细节存在差异;同时原正则未正确锚定路径首尾,可能导致匹配逻辑偏差。
修正方案
1. 纠正正则语法与转义
如果你的需求是匹配**以11位大写字母数字结尾(且排除纯数字的11位)**的路径,正确的Java正则(适配WireMock)应为:
^/my/interesting/path/(?!\\d{11}$)[A-Z0-9]{11}$
在WireMock的JSON映射文件中,所有反斜杠需双重转义(JSON语法要求),最终配置为:
{ "request": { "method": "GET", "urlPathPattern": "^/my/interesting/path/(?!\\\\d{11}$)[A-Z0-9]{11}$" }, "response": { "status": 200, "body": "Matched successfully" } }
2. 简化正则(若无需排除纯数字)
如果仅需匹配11位大写字母数字结尾的路径,可去掉负向预查,简化为:
{ "request": { "method": "GET", "urlPathPattern": "^/my/interesting/path/[A-Z0-9]{11}$" } }
关键说明
- 负向预查语法:Java正则中
(?!...)是合法的负向预查,无需转义?;转义?会使其变为字面量,完全失效。 - 路径锚定:
^和$强制正则匹配整个路径,避免WireMock匹配到包含目标路径的更长路径。 - 引擎一致性:验证正则时,请在regex101中选择Java引擎,而非默认的PCRE,确保与WireMock行为一致。
内容的提问来源于stack exchange,提问作者Martin H.
相关产品推荐
相关产品推荐

