【问题标题】:JS: Replace string that contains varying valuesJS:替换包含不同值的字符串
【发布时间】:2020-06-12 10:35:10
【问题描述】:

我有这个挑战:

我需要用这个字符串替换这个字符串:"[[OM:random-string-id]]"'<div id="random-string-id"></div>'

其中 OM 是要替换的组件 TYPE,random-string-id 是 id。这两个部分都可以是动态的,我只需要将组件替换为类型:'OM'。

# pseudocode

var text = [[$A:$B]] # this can be: "[[OM:something]]", "[[AD:somethingelse]]"

if ($A == 'OM') {
  text = text.replace(<div id='$B'></div>)
}

输入:[[OM:something]] =&gt; Output: "&lt;div id='something'&gt;&lt;/div&gt;" 输入:[[AD:somethingelse]] =&gt; Output: "[[AD:somethingelse]]"

最好的处理方法是什么?

【问题讨论】:

    标签: javascript regex string replace


    【解决方案1】:

    使用内置replace的replacer功能:

    let str = "[[OM:random-string-idadsad]]"
    
    str = str.replace(/^\[\[([A-Z]+):(.*)\]\]$/i, function(match, group1, group2, offset, string) {
      if (!group1 || !group2) { //or check arguments.length, if less than 5 return..
        return;
      }
      if (group1.toUpperCase() === "OM") {
        return "<div id='" + group2 + "'></div>"
      } else {
        return string;
      }
    })
    
    console.log(str)

    【讨论】:

    • ...regx 和替换逻辑对于 OP 正在寻找的东西来说都是不必要的复杂,如果一个人完全遵循提供的信息... "...我只需要用类型替换组件:'OM'。"
    • 建议的解决方案是可扩展和模块化的。您的 es6 代码可能会运行得更慢,因为它包含解构。而且它是不灵活的,因为您对“OM”进行了硬编码。外壳会破坏它。在ie11中不起作用。我要继续吗?
    • 字符串替换变成了美德信号。舞台是你的彼得,我不在了。
    【解决方案2】:

    关于正则表达式 ...

    .../^\[\[OM\:([^\]]+)\]\]$/...

    • 首先trims 每个字符串...然后...

    • /^ ... $/ ...从字符串的开头到结尾查找...

    • \[\[OM\:... 两个左括号,后跟 OM 和一个 : ... 然后
    • ([^\]]+)... 捕获/记住任何不是] 的字符序列...
    • 后跟 ...\]\] 两个右括号。

    function replaceSomething(str) {
      return str.trim().replace(
        (/^\[\[OM\:([^\]]+)\]\]$/),
        ((...result) => `<div id="${ result[1] }"></div>`)
      );
    }
    
    const listOfInputValues = ['[[OM:something]]', '[[AD:somethingelse]]', '[[OM:something]]', '[[AD:somethingelse]]'];
    
    const listOfOutputValues = listOfInputValues.map(replaceSomething);
    
    console.log('listOfOutputValues : ', listOfOutputValues);
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    在与 Ibrahim Tanyalcin 讨论后,将上面给出的方法迭代为更通用的方法(因此更灵活),Ibrahim 选择的示例归结为类似的东西......

    function createMarkupWithCapturedId(match, id) {
      return ['<div id="', id, '"></div>'].join('');
    }
    function transformTagByName(tagName, tag) {
      const regX = RegExp('^\\[\\[' + tagName + '\\:([^\\]]+)\\]\\]$');
      return tag.trim().replace(regX, createMarkupWithCapturedId);
    }
    
    console.log(`'[[OM:random-string-idadsad]]' => '${ transformTagByName('OM', '[[OM:random-string-idadsad]]') }'`);
    
    console.log(`'[[AD:random-string-idadsad]]' => '${ transformTagByName('OM', '[[AD:random-string-idadsad]]') }'`);
    
    console.log(`'[[OM:random-string-idadsad]]' => '${ transformTagByName('AD', '[[OM:random-string-idadsad]]') }'`);
    
    console.log(`'[[AD:random-string-idadsad]]' => '${ transformTagByName('AD', '[[AD:random-string-idadsad]]') }'`);
    .as-console-wrapper { min-height: 100%!important; top: 0; }

    【讨论】:

      【解决方案3】:

      名称描述了错误的类型,.name 的值可以是:EvalError、RangeError、ReferenceError、SyntaxError、TypeError 和 URIError。您可以根据 .name 属性返回的错误类型决定以不同方式处理错误。

      【讨论】:

      • 很抱歉,我完全错过了你的意思。你是在说问题的标题吗?您的回答似乎与我遇到的问题无关。我描述了我有一个字符串作为输入,转换后的字符串作为输出 - 没有对象,没有属性等。只有两个字符串。
      • 您似乎将此答案发布到了错误的帖子中?
      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 2021-06-08
      • 2011-03-10
      • 2019-05-25
      • 1970-01-01
      • 2021-11-09
      • 2014-03-30
      • 2019-05-29
      相关资源
      最近更新 更多