【问题标题】:replace char with regexp and map - js [duplicate]用正则表达式和映射替换char - js [重复]
【发布时间】:2020-07-01 15:44:20
【问题描述】:

(这个问题是我之前问题的延续:“how to find private char utf8 in a text?”) 我需要用它的值(存储在地图中)替换每个匹配项,但我已经测试了几件事,包括这个(如下),但它不起作用。我可能没有后见之明来找到解决方案。我已经开了一个小时了。我可能犯了一个很大的错误,为此感到抱歉。 这是我的代码:

const regex = /[\uE000-\uF8FF\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/gu;

var map = new Map();
//set example values in the map
map.set("󰀁", 'something1'); 
map.set("󰀂", 'something2');
map.set("󰀃", 'something3');
map.set("󰀄", 'something4');
    
const str = "\u{f0001} lorem ipsum \u{f0002} dolor sit amet \u{f0003}\n consectetur adipiscing elit\u{f0004}\sed do eiusmod tempor</"; // my text
console.log(str);
    
var tab = str.match(regex).map(x => Array.from(x)
    .map((v) => v.codePointAt(0).toString(10))
    .map((hex) => "0000".substring(0, 4 - hex.length) + hex))
    
for(var i = 0 ; i < tab.length ; i++){
    str.replace(/[\uE000-\uF8FF\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/u, map.get("&#"+tab[i][0]+";"));
}
console.log(str); //nothing change

【问题讨论】:

  • 字符串是不可变的,你用replace修改str,但不要给它分配新值。但是您还需要用 let 声明 str,而不是用 const

标签: javascript regex


【解决方案1】:

字符串是不可变的,没有方法或操作符会改变它们。

在您的 for 循环中,您应该将 str 重新分配给 str.replace 的结果,我想就是这样 ?

for(var i = 0 ; i < tab.length ; i++){
    str = str.replace(/[\uE000-\uF8FF\u{F0000}-\u{FFFFD}\u{100000}-\u{10FFFD}]/u, map.get("&#"+tab[i][0]+";"));
}

请注意,您在此正则表达式上没有 'g' 标志,不确定这是否有意

编辑:正如 Wiktor 指出的,您必须将声明从 const 切换到 let

【讨论】:

  • strconst
  • 当然,需要更改。但是对此投反对票?你对我太苛刻了!部分答案不是误导性答案
  • 编辑完成。感谢您指出这一点:)
  • 感谢 Apolo(实际上是 Wiktor):D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-20
相关资源
最近更新 更多