如何用正则验证XXXX XXXX-XXXX XXXX-XXXX-XXXX-XXXX-XXXX数字格式?
修正正则表达式匹配指定格式
首先,咱们先明确你要匹配的固定格式:XXXX XXXX-XXXX XXXX-XXXX-XXXX-XXXX-XXXX,其中每个X是0-9的数字,这个格式的结构是固定的,不是可选分段,所以你之前用的正则[0-9]{4}(-?[0-9]{4})?完全没覆盖到所有的分隔符和重复结构,才会出现匹配错误的情况。
正确的正则表达式
你可以用这个严格匹配目标格式的正则:
^\d{4} \d{4}-\d{4} \d{4}(-\d{4}){4}$
或者用等价的[0-9]代替\d,更直白一点:
^[0-9]{4} [0-9]{4}-[0-9]{4} [0-9]{4}(-[0-9]{4}){4}$
拆解一下这个正则的逻辑:
^:匹配字符串的开头,确保前面没有多余字符\d{4}:匹配第一组4位数字 + 空格\d{4}-\d{4}:匹配第二组4位数字 + 连字符 + 第三组4位数字 + 空格\d{4}:匹配第四组4位数字(-\d{4}){4}:匹配「连字符 + 4位数字」这个组合重复4次(对应后面的四组XXXX-XXXX-XXXX-XXXX)$:匹配字符串的结尾,确保后面没有多余字符
为什么之前的正则不行?
你原来的[0-9]{4}(-?[0-9]{4})?只能匹配两种情况:
- 单独的4位数字
- 4位数字 + 可选的连字符 + 4位数字
完全没有考虑到格式里的空格,也没有处理多次重复的分段,所以会错误匹配到像4586-4584-5588-5558-5888-5545这种不符合空格位置的字符串。
测试示例
- 匹配成功的合法格式:
1234 5678-9012 3456-7890-1234-5678-9012 - 匹配失败的非法格式:
4586-4584-5588-5558-5888-5545(缺少规定位置的空格)、12345 6789-0123 4567-8901-2345-6789-0123(第一组是5位数字)
内容的提问来源于stack exchange,提问作者e2rabi
相关产品推荐
相关产品推荐

