【问题标题】:How do I replace all letters in a string with another letter/special character? [duplicate]如何用另一个字母/特殊字符替换字符串中的所有字母? [复制]
【发布时间】:2019-07-19 01:25:53
【问题描述】:

我正在尝试制作一个小型节点应用程序,让我可以将文本转换为双打“字母”。我对 JavaScript 还很陌生,我想知道最好的方法是什么?

我可以使用:string.replace("A", doublestruck.uppercase.A)(见下文)62(26 个大写,26 个小写,10 个数字),但我觉得肯定有更好的方法来做到这一点。

// specialcharacters.js
const doubleStruckUpper = {
        A: "????", B: "????", C: "ℂ", D: "????", E: "????",
        F: "????", G: "????", H: "ℍ", I: "????", J: "????",
        K: "????", L: "????", M: "????", N: "ℕ", O: "????",
        P: "ℙ", Q: "ℚ", R: "ℝ", S: "????", T: "????",
        U: "????", V: "????", W: "????", X: "????", Y: "????",
        Z: "ℤ"
    };
const doubleStruckLower = { ... };
const doubleStruckNumbers = { ... };

module.exports.doubleStruck = {
    uppercase: doubleStruckUpper,
    lowercase: doubleStruckLower,
    numbers: doubleStruckNumbers,
};

// index.js

const { doubleStruck } = require("./specialcharacters");

var string = "Change this to double-struck characters";

string
    .replace("A", doubleStruck.uppercase.A)
    .replace("B", doubleStruck.uppercase.B)
    // and so on

这可行,但它必须很长,并且可能有更好的方法来做到这一点。

提前致谢!

【问题讨论】:

  • 肯定可以进行一些改进。本质上,您运行在 O(N) 的 StringLength * 26。它可以改进为 Stringlength 虽然
  • Object.keys(doubleStruck).forEach(key => Object.keys(doubleStruck[key]).forEach(k => string.replace(new RegExp(k, 'g'), doubleStruck[key][k])))

标签: javascript node.js


【解决方案1】:

.replace 让你use a function:

const doubleStruckUpper = {
        A: "?", B: "?", C: "ℂ", D: "?", E: "?",
        F: "?", G: "?", H: "ℍ", I: "?", J: "?",
        K: "?", L: "?", M: "?", N: "ℕ", O: "?",
        P: "ℙ", Q: "ℚ", R: "ℝ", S: "?", T: "?",
        U: "?", V: "?", W: "?", X: "?", Y: "?",
        Z: "ℤ"
    };

var string = "CHANGE THIS TO DOUBLE STRUCK LETTERS";

var result = string.replace(/[A-Z]/g, matchedLetter => doubleStruckUpper[matchedLetter]);

console.log(result);

结合正则表达式,您可以找到并匹配所有所需的字符,然后将它们一一替换为所需的字符。由于您已经创建了角色地图,这应该是一个相当快速和简单的过程,但我建议您将您的角色地图组合到一个地图中以使其更快更简单。

【讨论】:

    【解决方案2】:

    另一个例子是对mapstring中的每个字符进行双击。如果您不需要在 3 个不同的地图中保留双击字符,我建议将它们合并到一个地图中(例如:doubleStruckAll),然后您可以简单地映射如下:

    var string = "Change this to double-struck characters";
    
    const result = [...string].map(letter => {
        const replaced = doubleStruckAll[letter];
        return replaced ? replaced : letter;
    }).join('')
    
    console.log(result);
    

    上面的代码将字符串展开成一个字符数组,然后将每个字符映射到双击(如果双击中存在条目,则返回替换字符,否则返回原始字符)。然后它将新数组重新连接成一个字符串。

    【讨论】:

      【解决方案3】:

      ES6/ES2015 引入了一种方法来表示星体平面中的 Unicode 点(任何需要超过 4 个字符的 Unicode 代码点),方法是将代码包装在图形括号中。

      const unicodePoints = {
        A: '\u{1D538}',
        B: '\u{1D539}',
        C: '\u{2102}',
        D: '\u{1D53B}',
        E: '\u{1D53C}',
        F: '\u{1D53D}',
        G: '\u{1D53E}',
        H: '\u{210D}',
        I: '\u{1D540}',
        J: '\u{1D541}',
        K: '\u{1D542}',
        L: '\u{1D543}',
        M: '\u{1D544}',
        N: '\u{2115}',
        O: '\u{1D546}',
        P: '\u{2119}',
        Q: '\u{211A}',
        R: '\u{211D}',
        S: '\u{1D54A}',
        T: '\u{1D54B}',
        U: '\u{1D54C}',
        V: '\u{1D54D}',
        W: '\u{1D54E}',
        X: '\u{1D54F}',
        Y: '\u{1D550}',
        Z: '\u{2124}'
      };
      
      console.log("CHANGE THIS TO DOUBLE STRUCK LETTERS".replace(/[A-Z]/g, el => unicodePoints[el].normalize()));

      您可以将其用作在地图中使用文字 Unicode 字符的替代方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-13
        • 2020-08-27
        • 2021-12-10
        • 2023-04-09
        • 1970-01-01
        • 2014-05-18
        • 2019-12-01
        • 2012-10-10
        相关资源
        最近更新 更多