防止.replace替换已替换的字母

3
作为一种实践,我正在尝试创建一个假的“翻译器”,使用.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;
}

任何帮助都将不胜感激!

创建一个对象并使用键值对来确定应该是什么,而不是多次使用 .replace。 :s - Jeremy Jackson
这里是'Jonas w'的代码,应用了一些方便的“伪本地化”字母替换:https://jsfiddle.net/7snz7n4f/ - The Gav Lad
5个回答

0

使用我的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'

0

这种方法效率极低,但可以大致理解——基本上你需要将字符串拆分为字符数组,然后对每个字符进行替换:

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);
}

这并不能解决问题。用户不希望被替换的字母再次被替换:a-> x-> b -> e或类似的情况。 - Jonas Wilms
@Jonasw 这确实解决了那个问题。除非你误解了问题?他想要将f -> k进行更改,然后当它到达k(最初是f)时,他不希望再次更改它,因为它已经被替换了。每个字符应该只被替换一次。这样就解决了这个问题。 - dave
但是你的代码不是将str中的g替换为x,然后将b中的g替换为该结果吗?实际上这样做是一样的吧? - Jonas Wilms
@Jonasw 啊,我明白你的意思了,是的,这就是为什么我在底部留下了注释,他需要有一个字符映射表。我会更新使其更加清晰。 - dave

0
我会采用不同的方式 - 创建数字来代表字母。
例如结构:
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代码只是伪代码,我只想展示这个想法。最重要的是数字应该像标识符一样唯一。


0

你的解决方案每次都需要扫描整个字符串以进行替换。最好逐个字符进行转换。

这是一个简单粗暴的版本,仅涵盖小写字母范围--你可以将其优化并覆盖任何字符范围:

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);

0

好的,我认为这不能用替换来完成,这是我会做的方式:

//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("");

字符串被替换为字符...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接