求符合SEPA规则的Java 17兼容正则表达式
SEPA 合规正则表达式(兼容Java 17)
以下是完全符合你需求的正则表达式,适配Java 17环境:
^(?!/)(?!.*//)[a-zA-Z0-9/\-?:().,'+ ]+(?<!/)$
规则拆解
^(?!/):确保字符串不以/开头(?!.*//):确保字符串不包含连续的//[a-zA-Z0-9/\-?:().,'+ ]+:匹配所有允许的字符,包括:- 大小写英文字母、数字
- 指定符号:
/ - ? : ( ) . , ' + - 空格
(?<!/):确保字符串不以/结尾^和$:锚定整个字符串,确保从开头到结尾完全匹配规则
Java 代码适配说明
在Java字符串中,反斜杠需要双重转义,所以实际使用的正则字符串应为:
"^(?!/)(?!.*//)[a-zA-Z0-9/\\-?:().,'+ ]+(?<!/)$"
验证示例
import java.util.regex.Pattern; import java.util.regex.Matcher; public class SepaValidator { private static final Pattern SEPA_VALIDATOR = Pattern.compile("^(?!/)(?!.*//)[a-zA-Z0-9/\\-?:().,'+ ]+(?<!/)$"); public static boolean validate(String input) { return input != null && SEPA_VALIDATOR.matcher(input).matches(); } public static void main(String[] args) { // 测试用例 System.out.println(validate("John Doe (DE) +49 123/456-789")); // 有效,输出true System.out.println(validate("/Invalid Start")); // 以/开头,输出false System.out.println(validate("Invalid End/")); // 以/结尾,输出false System.out.println(validate("Contains//Double Slash")); // 含连续//,输出false System.out.println(validate("Valid, String. With? All: Allowed 'Symbols'")); // 有效,输出true } }
常见问题排查
之前的正则无效可能是以下原因:
- 转义错误:Java中
-在字符集里如果不放在末尾或转义,会被解析为字符范围(比如a-z),导致符号匹配异常 - 未覆盖所有规则:只处理了开头/结尾的/,没检查连续//;或者反之
- 未锚定字符串:缺少
^和$,导致部分匹配通过,而非整个字符串符合规则
内容的提问来源于stack exchange,提问作者Marco_Frost
相关产品推荐
相关产品推荐

