如何在JavaScript字符串中替换不匹配代理对为替换字符?
处理未配对UTF-16代理对的方案
JavaScript里没有专门匹配未配对代理对的内置正则字符类,必须通过额外的正则逻辑来处理。
UTF-16代理对由高代理码元(范围 U+D800 到 U+DBFF)和紧随其后的低代理码元(范围 U+DC00 到 U+DFFF)组成,单独存在的高/低代理都是不合法的,需要替换为替换字符(通常用 \uFFFD)。
具体处理分两步:
- 先替换无后续低代理的高代理
// 匹配高代理且后面没有低代理的情况 str = str.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])/g, '\uFFFD'); - 再替换无前序高代理的低代理
如果你的运行环境支持ES2018及以上的后行断言,可以用:
若环境不支持后行断言,改用分组匹配的方式:// 匹配低代理且前面没有高代理的情况 str = str.replace(/(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, '\uFFFD');// 匹配开头或非高代理后的低代理 str = str.replace(/(^|[^\uD800-\uDBFF])([\uDC00-\uDFFF])/g, '$1\uFFFD');
注意必须按先高代理后低代理的顺序处理,避免误判合法代理对中的低代理。
内容的提问来源于stack exchange,提问作者user3064538
相关产品推荐
相关产品推荐

