我尝试替换一些代码,但是有两个问题。
我有以下代码: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()
,但是当我写一些东西来替换和替换单词时,如何只运行一次替换字符?
答案 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 );