使用正则捕获组转换ID中UTF-16值时$1不被识别的问题
问题解决:正则捕获组在replaceAll中无法解析的问题
问题出在你调用replaceAll的方式上:当第二个参数是函数调用时,"0" + "$1"里的$1只是普通字符串,不会被正则引擎替换为捕获组的匹配值——因为String.fromCodePoint是先执行的,此时$1还没被解析,就直接作为参数传入了。
正确的做法是把replaceAll的第二个参数换成回调函数,正则匹配到内容时会自动把捕获组的值传给函数,在函数内部完成转码逻辑:
var x = "ELEMENTT_x5F_GS1_x5F_MARKETING_x5F_CLAIM__x3B__INSTANCE_x3D_3__x3B__LOCALE_x3D_1_" var regex = /_(x..)_/g; var replacedID = x.replaceAll(regex, (_, hex) => { // hex 对应正则里的$1捕获组,比如x5F、x3B const code = parseInt(`0${hex}`, 16); return String.fromCodePoint(code); });
代码说明
- 回调函数的第二个参数
hex就是正则捕获到的x..部分; - 用
parseInt把0${hex}解析为16进制整数(比如0x5F对应ASCII码95,即下划线); - 最后用
String.fromCodePoint把编码转成对应的字符。
执行后replacedID的结果为:ELEMENTT_GS1_MARKETING_CLAIM;INSTANCE=3;LOCALE=1_
内容的提问来源于stack exchange,提问作者Duve
相关产品推荐
相关产品推荐

