防止.replace替换已经替换的字母
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止.replace替换已经替换的字母相关的知识,希望对你有一定的参考价值。
作为一种练习,我正在尝试创建一个假的“翻译器”,它将使用.replace将英语转换成字母的混乱版本,但是我有一个问题,即.replace动作取代之前被替换过的字母。
有没有办法让我阻止代码重新替换已被替换的字母?
我的html:
<button onclick="Function()">click</button>
<p id="let">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</p>
<p id="demor"></p>
我的javascript:
function Function() {
var str = document.getElementById("let").innerHTML;
var txt = str.replace(/a/g,"x").replace(/b/g,"b").replace(/c/g,"c").replace(/d/g,"d").replace(/e/g,"a").replace(/f/g,"k").replace(/g/g,"s").replace(/h/g,"r").replace(/i/g,"e").replace(/j/g,"i").replace(/k/g,"d").replace(/l/g,"r").replace(/m/g,"z").replace(/n/g,"m").replace(/o/g,"s").replace(/p/g,"v").replace(/q/g,"p").replace(/r/g,"r").replace(/s/g,"k").replace(/t/g,"s").replace(/u/g,"i").replace(/v/g,"q").replace(/w/g,"v").replace(/x/g,"x").replace(/y/g,"e").replace(/z/g,"b");
document.getElementById("demor").innerHTML = txt;
}
任何帮助将不胜感激!
答案
对于每次更换,您的解决方案将扫描整个字符串一次。更好地通过char进行char,依次对每个进行翻译。
这是一个快速和肮脏的版本,减少到只覆盖小写字母 - 你可以整理它,使它涵盖你喜欢的任何字符范围:
var input = "helloworld";
var xlate = "bcdefghijklmnopqrstuvwxyza";
var asciiA = 'a'.charCodeAt();
var out = "";
for(i=0;i<input.length;i++) {
out = out + xlate[input[i].charCodeAt() - asciiA];
}
alert(out);
另一答案
好吧,我认为用替换不能做到这一点,我就是这样做的:
//create translation arrays
var letters=["a","b",...];
var replacewith=["x","b",...];
//move the string to an array
var string="abc";
var arr=string.split("");
for(i=0;i<arr.length;i++){
for(o=0;o<letters.length;o++){
if(arr[i]==letters[o]){
//replace
arr[i]=replacewith[o];
//stop replacing
break;
}
}
}
string=arr.join("");
字符串替换为字符...
另一答案
我会以不同的方式 - 创建将代表字母的数字。
结构示例:
var nums={
1:"a",
2:"b",
3:"c",
4:"d"
...//rest
}
接下来将原始文本更改为数字:
str.replace(/a/g,"1").replace(/b/g,"2") ...
最后是做第二次替换,但最后的字母
str.replace(/1/g,nums[1]).replace(/2/g,nums[2]) ...
所以我们确信改变不会被覆盖。我的答案中的js代码是伪代码,我只想表明这个想法。最重要的是数字应该像识别者一样,因此必须是唯一的。
另一答案
这是非常低效的,但应该得到一般的想法 - 基本上你拆分字符串所以它是一个字符数组,然后在每个字符上运行替换:
var map = { a: 'x', b: 'b', c: 'c', d: 'd', e: 'a', f: 'k', g: 's', h: 'r', i: 'e', j: 'i', k: 'd', l: 'r', m: 'z', n: 'm', o: 's', p: 'v', q: 'p', r: 'r', s: 'k', t: 's', u: 'i', v: 'q', w: 'v', x: 'x', y: 'e', z: 'b' };
function Function() {
var str = "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 txt = str.split('').map(function(c) {
return map[c];
}).join('');
console.log(txt);
}
另一答案
使用我的replace-once包,您可以执行以下操作:
const replaceOnce = require('replace-once')
var str = '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 find = 'abcdefghijklmnopqrstuvwxyz'
var replace = 'xbcdaksreidrzmsvprksiqvxeb'
replaceOnce(str, find.split(''), replace.split(''), 'gi')
//=> 'x b c d a k s r e i d r z m s v p r k s i q v x e b'
以上是关于防止.replace替换已经替换的字母的主要内容,如果未能解决你的问题,请参考以下文章