如何使用正则表达式匹配字符串从末尾数第n位的字符
正则实现:匹配字符串倒数第n位指定字符
直接上可用的正则模式,完全匹配反向计数的规则要求:
目标字符(?=.{n}$)
模式里的n直接替换成需要的倒数偏移量,目标字符替换成要校验的字符即可。
匹配逻辑
这个写法用了正则的正向先行断言,不需要分组捕获,匹配效率很高:
- 正向先行断言
(?=规则)只会校验当前字符后面的内容是否符合规则,不会额外消耗匹配字符 - 断言部分
.{n}$的含义是:当前字符后面刚好有n个任意字符,且这n个字符之后就是字符串结尾,刚好卡准倒数第n位的位置
效果验证
完全对齐给出的所有测试场景:
测试字符串:molly
- n=0(最后一位):正则为
y(?=.{0}$)(等价于y$),匹配到末尾的y,符合预期 - n=1(倒数第二位):正则为
l(?=.{1}$),匹配到y前面的l,符合预期 - n=3(倒数第四位):正则为
o(?=.{3}$),o后面刚好跟着l、l、y三个字符到结尾,匹配到o,符合预期 - 判定场景:校验倒数第二位是不是l,用
l(?=.{1}$)匹配molly能命中,返回true,符合要求
测试字符串:terminator
- 判定场景1:校验倒数第四位是不是b,对应正则
b(?=.{3}$),该位置实际字符是a,匹配失败返回false,符合要求 - 判定场景2:校验倒数第四位是不是a,对应正则
a(?=.{3}$),可以正常命中,返回true,符合要求
注意事项
- 如果待匹配字符串包含换行符,要开启正则的单行模式(Dotall模式),让模式里的
.可以匹配换行符,否则跨行场景会匹配失效 - 如果要匹配的目标字符是正则特殊符号(比如
.、*、?、$、^这类),要先给字符加反斜杠转义,比如要匹配倒数第2位是.,正则要写成\.(?=.{1}$)
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

