JavaScript正则实现字符串末尾恰好单次匹配s或m字符的方法
正则匹配实现方案
匹配规则梳理
- 字符串末尾必须为小写
s或小写m - 末尾的
s/m仅可出现1次,不允许连续的s/m结尾 - 匹配区分大小写,末尾为大写
S/M、其他任意字符均不符合要求 - 规则校验用例:
- 符合要求(返回true):
121s、121m - 不符合要求(返回false):
121ss、121ms、末尾为大写M/H等其他字符的字符串
- 符合要求(返回true):
原有写法问题
之前编写的/[mh]{1}$/存在两处错误:
- 字符集包含规则不要求匹配的
h,遗漏了需要匹配的s - 仅校验了最后1位字符,未约束倒数第二位不能是
s/m,会导致121ss、121ms这类连续s/m结尾的字符串被误判通过
正确正则
通用版本(适配长度≥2的字符串)
/[^sm][sm]$/
兼容版本(额外支持长度为1的字符串,即内容为单独s/m的场景)
/(?:^|[^sm])[sm]$/
正则逻辑说明
[sm]$:锚定字符串末尾,要求最后一位必须是小写s或m,天然满足区分大小写、排除大写字符/其他字符的要求[^sm]:要求倒数第二位字符不能是s或m,从根源避免末尾连续出现s/m的情况- 兼容版本中的
(?:^|[^sm])表示匹配字符串开头,或者非s/m的字符,解决长度为1时不存在倒数第二位的匹配问题
用例校验结果
121s:倒数第二位为非s/m的1,末位为s,匹配通过121m:倒数第二位为非s/m的1,末位为m,匹配通过121ss:倒数第二位为s,匹配失败121ms:倒数第二位为m,匹配失败121M/121H:末位不是小写s/m,匹配失败- 单独字符
s/m:兼容版本可正常匹配通过
内容的提问来源于stack exchange,提问作者MaheenUnzeelah
相关产品推荐
相关产品推荐

