如何编写正则表达式匹配最后两位至少有一位不是数字的字符串?
正则匹配需求说明
需要实现单个正则匹配规则:
- 需匹配的字符串特征:末尾两位中至少有1位不是数字,包含三类场景:
- 倒数第二位为数字、最后一位为非数字(例:
xy9z) - 倒数第二位为非数字、最后一位为数字(例:
xyz9) - 倒数两位均为非数字(例:
xyzw)
- 倒数第二位为数字、最后一位为非数字(例:
- 需排除的字符串特征:末尾两位均为数字(例:
xyz99)
可用正则方案
方案1:兼容老旧正则引擎(无断言依赖,推荐优先使用)
正则表达式:
.*([^0-9].|.[^0-9])$
注:如果是glob通配场景(比如文件搜索)使用,把正则开头的
.*替换为*即可,对应写法为*([^0-9].|.[^0-9])。
规则逻辑说明
.*匹配目标字符串末尾两位之前的任意长度任意字符$锚定字符串结尾位置,确保规则校验的是字符串最后两位([^0-9].|.[^0-9])覆盖末尾两位至少一位非数字的所有合法场景:[^0-9].:倒数第二位为非数字,最后一位为任意字符.[^0-9]:最后一位为非数字,倒数第二位为任意字符- 两个分支用或逻辑连接,自动排除末尾两位全为数字的场景,不会误匹配
xyz99这类记录。
方案2:负向断言简洁写法(适配支持PCRE、JavaScript ES6+、Python re等现代正则引擎的环境)
正则表达式:
^(?!.*\d{2}$).*
规则逻辑说明
^锚定字符串开头位置(?!.*\d{2}$)为负向先行断言,直接排除「整个字符串以两位数字结尾」的记录- 后续
.*匹配所有不触发排除规则的完整字符串,写法更简短。
原有写法的问题
之前使用的*[^0-9][^0-9]$只覆盖了「末尾两位全为非数字」的单一场景,漏掉了仅一位为非数字的两类合法情况,因此无法匹配全部目标记录。
内容的提问来源于stack exchange,提问作者Dave Smith
相关产品推荐
相关产品推荐

