如何用单个正则表达式依次实现空格移除与年份截断功能?
解决方案:分两步正则替换(优先推荐)
你遇到的问题核心是需要先清理空格,再处理年份截断,用|组合正则只会匹配其中一种情况,无法按顺序执行。最可靠的方式是连续执行两次正则替换,大部分编程语言、表单验证工具都支持这个操作:
第一步:移除所有空格
使用全局匹配的正则 \s(比如在JS里是/\s/g),将所有空格替换为空字符串。
- 示例输入:
3088143101 1975→ 处理后:30881431011975 - 示例输入:
308 814 3101 75→ 处理后:308814310175
第二步:处理年份截断
使用正则 ^(\d{10})(19|20)(\d{2})$,替换为 $1$3:
- 对于14位的纯数字(含完整年份):
30881431011975→ 替换后:308814310175(忽略第11-12位的19,保留年份后两位75) - 对于已经符合要求的12位纯数字:
308814310175→ 正则不匹配,结果保持不变
备选方案:单次正则替换(仅当无法执行两次替换时使用)
如果你的环境只能设置一个正则替换规则,可以使用以下组合正则覆盖带空格的两种输入场景:
正则表达式:
^\s*(\d{10})(?:(19|20)\s*(\d{2})|(\d{2}))\s*$
替换为:$1$3$4
规则解释
^\s*和\s*$:匹配字符串首尾的任意空格(\d{10}):捕获核心的前10位数字(最终结果的前10位)(?:(19|20)\s*(\d{2})|(\d{2})):非捕获组,匹配两种合法输入:- 完整年份格式:
(19|20)\s*(\d{2})→ 捕获年份后两位到分组3 - 直接年份后两位格式:
(\d{2})→ 捕获这两位到分组4
- 完整年份格式:
- 替换时
$1$3$4:自动取对应分组的内容,不管是哪种输入格式,最终都会得到12位合法密码
注意:这个方案仅适用于空格不在前10位数字中间的场景(比如
3088143101 1975可以处理,但3 088143101 1975无法匹配),所以优先推荐两次替换的方案。
内容的提问来源于stack exchange,提问作者Lukasz Kozlowski
相关产品推荐
相关产品推荐

