【问题标题】:JavaScript String Replace allJavaScript 字符串全部替换
【发布时间】:2021-04-19 19:24:26
【问题描述】:

我有以下字符串,我想替换字符串的所有特殊字符。

let data = "`test@#$demo%^here[sf.s]\|demo{delata}*testing?+$^()`"

特殊字符:

let spcial=[".", "+", "*", "?", "^", "$", "(", ")", "[", "]", "{", "}", "|", "\"];

最终输出:

test@#\\$demo%\\^here\\[sf\\.s\\]\\\\\|demo\\{delata\\}\\*testing\\?\\+\\$\\^\\(\\)

简而言之,我想在特殊字符前添加\,我该怎么做?

【问题讨论】:

  • 建议使用 6 个 sn-ps。解决方案解释。你检查过吗?
  • 请考虑提出的解决方案,您与这些回复的互动可以帮助许多其他有类似问题的人。在此先感谢 Suraj Dalvi。

标签: javascript node.js string replace


【解决方案1】:

let data = "`test@#$demo%^here[sf.s]\|demo{delata}*testing?+$^()`"
let spcial=[".", "+", "*", "?", "^", "$", "(", ")", "[", "]", "{", "}", "|", "\\"]    
for (let c of data) {
  if(spcial.includes(c) ) {
    data = data.replace(c, '\\'+c)
  }
}
console.log(data)

【讨论】:

    【解决方案2】:

    let data = "`test@#$demo%^here[sf.s]\\|demo{delata}*testing?+$^()`"
    let spcial=[".", "+", "*", "?", "^", "$", "(", ")", "[", "]", "{", "}", "|", "\\"]
    
    const res = data.split("").map(ch => spcial.includes(ch) ? "\\\\" + ch : ch).join("")
    
    console.log(res)

    【讨论】:

    • 想要在作为数组一部分的每个关键字之前添加“\\”。我的字符串也包含“s]\|”所以想为每个字符添加“\\”。
    • 是的,但是因为“\|demo”而停顿我想要“\\\\\|demo”想要考虑字符串中存在的“\”
    • 因为"\|"被识别为“|”。您可以将其更改为“\\|demo”
    【解决方案3】:
    let data = "`test@#$demo%^here[sf.s]\|demo{delata}*testing?+$^()`";
    let special=[".", "+", "*", "?", "^", "$", "(", ")", "[", "]", "{", "}", "|", "\\"];
    let [...chars] = data;
    chars = chars.map(char => {
        if (special.includes(char)) return `\\${char}`;
        return char;
    }
    data = chars.join("");
    

    【讨论】:

      【解决方案4】:

      str = "test@#$demo%^here[sf.s]\|demo{delata}*testing?+$^()";
      const spcial=[".", "+", "*", "?", "^", "$", "(", ")", "[", "]", "{", "}", "|", "\\"];
      spcial.forEach(myFunction);
      
      function myFunction(value) {
        str = str.replaceAll(value, "\\" + value);
      }
      
      console.log(str)

      【讨论】:

      【解决方案5】:

      我认为从长远来看,学习一些正则表达式 (regex/regexp) 对你有好处。我用来查找特殊字符的正则表达式是/[^a-zA-Z0-9]/g。如果你使用带有回调函数的replace方法,你可以把匹配的特殊字符m替换成\\${m}

      在此处阅读有关 RegEx 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp

      在此处阅读有关replace 的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

      要完全按照上面的要求做,这将是一个正则表达式实现:

      const data = "`test@#$demo%^here[sf.s]|demo{delata}*testing?+$^()`";
      const specialCharacters = /\.|\+|\*|\?|\^|\$|\(|\)|\[|\]|\{|\}|\||\\/g;
      const output = data.replace(specialCharacters, (m) => `\\${m}`);
      
      console.log(output);
      

      我建议检查更多特殊字符。

      const data = "`test@#$demo%^here[sf.s]|demo{delata}*testing?+$^()`";
      const output = data.replace(/[^a-zA-Z0-9]/g, (m) => `\\${m}`);
      console.log(output);
      

      【讨论】:

      • 我对正则表达式不太了解,但是否存在任何直接正则表达式以在指定字符之前添加 \\ 让 spcial=[".", "+", "*", "?", “^”、“$”、“(”、“)”、“[”、“]”、“{”、“}”、“|”、“\”];
      • 是的,你会使用/\.|\+|\*|\?|\^|\$|\(|\)|\[|\]|\{|\}|\||\\/g,但我不建议随意挑选特殊字符,除非你完全确定这些是你想要考虑的唯一特殊字符。
      • 是的,我只想考虑这些字符。如果可能的话,请您分享实际的替换语法
      【解决方案6】:

      方法 1:从固定的特殊字符列表中

      你可以一次全部替换,用这样的正则表达式:

      let data = "test@#$demo%^here[sf.s]\|demo{delata}*testing?+$^()";
      
      let replaced = data.replace(/[\.\+\*\?\^\$\(\)\[\]\{\}\|\\]/g, '\\$&');
      
      console.log(replaced);

      请注意,在正则表达式中列出了特殊字符,并使用反斜杠进行转义。 如果您想详细了解其工作原理,请查看here, in the "Explain" section

      方法 2:来自特殊字符的动态列表

      如果你想从一个数组动态构建这个正则表达式,你可以这样做:

      let data = "test@#$demo%^here[sf.s]\|demo{delata}*testing?+$^()";
      let specialChars = [".", "+", "*", "?", "^", "$", "(", ")", "[", "]", "{", "}", "|", "\\"];
      
      let regexp = new RegExp(`[\\${specialChars.join('\\')}]`, 'g');
      let replaced = data.replace(regexp, '\\$&');
      
      console.log(replaced);

      结果

      在这两个例子中,结果都是:

      test@#\$demo%\^here\[sf\.s\]\|demo\{delata\}\*testing\?\+\$\^\(\)
      

      使用全局替换(最后用g 表示),您可以一次替换所有字符,无需循环。

      【讨论】:

        猜你喜欢
        • 2011-09-04
        • 2021-03-01
        • 1970-01-01
        • 2015-03-06
        • 2016-07-07
        • 1970-01-01
        • 2015-03-22
        • 1970-01-01
        相关资源
        最近更新 更多