一次替换字符是唯一的问题吗?

时间:2019-09-06 09:39:14

标签: javascript

我尝试替换一些代码,但是有两个问题。

我有以下代码:E-1,E-2,E-3,E-4,E-5,E-6,E-7,E-8,E-9,我遇到了问题,所有代码都是E-1至E-99

1)例如当用户在文本字段中书写时,系统仅检测到第一个E-2,而不检测到E-20。

this.value=this.value.replace(/\Ε-2/g,"Ε-2 (APPLE)").replace(/\Ε-20/g,"Ε-20 (SAMSUNG)"

我该如何解决?

2)我正在运行这段代码onkeyup = function(),但是当我写一些东西来替换和替换单词时,如何只运行一次替换字符?

2 个答案:

答案 0 :(得分:0)

如果我们忽略了所提供代码的明显语法错误,则问题将归结为在单个replace调用中用多个结果替换多个值。 string.prototype.replace可以使用一个函数作为参数,您可以在其中指定替换规则而不是静态值。

您可以使用onkeyup来代替onchange,这样它只会在用户完成输入后才触发该函数,以避免重新替换已经替换的值。

function updateInput(input) {
  const output = input.value.replace(/E-[0-9]*/g, replaceFunction);
  input.value = output;
}

function replaceFunction(match) {
  // add additional rules here for more cases
  if (match === "E-2") return "Ε-2 (APPLE)";
  if (match === "E-5") return "Ε-5 (SOMETHING ELSE)";
  if (match === "E-20") return "Ε-20 (SAMSUNG)";
  return match;
}
<input onchange="updateInput(this)">

假设您有一些javascript对象,其格式为key为代码,value为替换值,您可以简单地

function replaceFunction(match) {
  return yourJsonObject[match] || match; // here i return a match in case the rule was not specified inside of yourJsonObject
}  

答案 1 :(得分:0)

修复语法错误将使代码运行。 添加逗号或行尾检测将区分N/2*sqrt(N)E-2。 如果我们不检查行尾,则最后一个E-20会因为缺少逗号而不会被替换。

E-

一个更好的解决方案,因为我们现在知道这里要处理99个不同的代码。 通过创建一个对象,我们可以从中引用E-代码,只需将新代码添加到对象中,就可以更新E-代码。正则表达式可以保持不变。 这也应该适用于许多不同的字符串,因为我们不再依赖逗号了。

// I have added another E-2 and a couple of E-20 to show that
// 1) All E-2 and E-20 instances gets replaced
// 2) E-2 is not considered part of E-20
const value = "E-1,E-2,E-3,E-4,E-5,E-6,E-7,E-8,E-9,E-2,E-20,E-20";

const replaced = value
  .replace( /(E-2)($|,)/g, '$1 (APPLE)$2' )
  .replace( /(E-20)($|,)/g, '$1 (SAMSUNG)$2' );
  
console.log( replaced );