如何重写不含正向后行断言的正则表达式以兼容Safari浏览器
兼容Safari的实现方案
原正则依赖Safari不支持的正向后行断言,且本身存在匹配逻辑冗余、错误问题。要定位字符串中第一个字母数字字符的位置,无需使用后行断言,单个基础正则即可实现全浏览器兼容,完全满足单正则实现的要求:
function capitalize(string: string) { const match = string.search(/[a-z0-9]/i); const index = match === -1 ? 0 : match; const characters = string.toLowerCase().split(''); characters[index] = characters[index].toUpperCase(); return characters.join(''); }
实现逻辑说明
- 正则
/[a-z0-9]/i可匹配任意大小写字母与数字,search方法会直接返回整个字符串中第一个匹配项的索引,刚好对应需要大写的目标字符位置。第一个匹配到的字母数字前必然全是非字母数字内容,不需要额外做前序字符判断。 - 当字符串内容全为非字母数字(如纯空格、纯符号)时,
search返回-1,此时默认取索引0做转换,非字母字符调用toUpperCase()不会产生内容变化,无异常输出。
原正则的问题
之前使用的/(?<=[^[a-z]|[0-9]\s])[a-z]|[0-9]/i存在两处明显缺陷:
- 使用了正向后行断言语法,Safari及部分旧版浏览器未实现该特性,直接报正则语法错误
- 匹配逻辑错误:无法正确匹配首字符为字母、后续带数字的场景,会错误定位到后续数字的位置,导致首字母未大写的异常结果
内容的提问来源于stack exchange,提问作者Mihkel Pajunen
相关产品推荐
相关产品推荐

