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

Java中正确使用HyperPay支付网关状态校验正则表达式的方法

解决HyperPay支付网关正则校验问题

问题根源分析

你遇到的问题核心有三点:

  1. 正则转义错误:原正则中的.是响应码里的字面量,但正则语法中.默认匹配任意字符,必须转义为\.才能匹配实际的点号。
  2. JS与Java正则的风格差异:对方提供的是JavaScript风格正则(带/^.../分隔符),但Java的Pattern.matches()不需要这些分隔符,且默认会对整个字符串做匹配(相当于自动给正则加上^和$)。
  3. 匹配范围不匹配:原正则里的000.100.1分支只能匹配长度完全等于000.100.1的字符串,但你的响应码是000.100.110(更长),所以无法命中该分支。

正确的正则与使用方式

修正后的正则表达式

根据HyperPay的校验逻辑,修正后的正则需要转义点号,并调整分支以覆盖目标响应码:

String regex = "^(000\\.000\\.|000\\.100\\.1.*|000\\.[36].*|000\\.400\\.[1][12]0)$";

各分支说明:

  • 000\\.000\\.:匹配所有以000.000.开头的响应码(比如000.000.123)
  • 000\\.100\\.1.*:匹配所有以000.100.1开头的响应码(包括你的000.100.110)
  • 000\\.[36].*:匹配所有以000.3或000.6开头的响应码(比如000.300、000.612)
  • 000\\.400\\.[1][12]0:精确匹配000.400.110或000.400.120

正确调用示例

方式1:直接使用Pattern.matches()

String responseCode = "000.100.110";
boolean isValid = Pattern.matches("^(000\\.000\\.|000\\.100\\.1.*|000\\.[36].*|000\\.400\\.[1][12]0)$", responseCode);
// 此时isValid会返回true

方式2:预编译正则(推荐,多次调用更高效)

Pattern pattern = Pattern.compile("^(000\\.000\\.|000\\.100\\.1.*|000\\.[36].*|000\\.400\\.[1][12]0)$");
Matcher matcher = pattern.matcher("000.100.110");
boolean isValid = matcher.matches();

关键注意事项

  • Java字符串中,正则的转义符\需要写成\\,所以匹配字面量点号要写\\.。
  • 如果HyperPay的校验逻辑是只要响应码开头符合分支模式即可,可以去掉正则末尾的$,但Pattern.matches()默认全匹配,所以必须通过.*来允许后续字符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:05:19