如何将一串随机字母分成一对子串,并在 Javascript 中连续替换新字符?

How do you divide a string of random letters into pairs of substrings and replace with new characters continuously in Javascript?

所以我正在从事这个项目,该项目涉及通过解析某些翻译的字母对,将文本字符串(例如 "als;kdfja;lsjkdf" 翻译成 "the big dog" 等常规字符。 (即:"fj" = "D")

问题是我不能简单地在 javascript 中使用 .replace() 函数,因为在很多情况下它都给出了文本 "fjkl",并且需要找到 "jk" 和 逻辑上 解释 "fj" 和 "kl" 的碰撞说它找到了。这对我不起作用,因为对我来说,它没有找到它,因为我只是想一次查看 2 个字符以内的找到的对。 (即:"fjkl" 只能产生 "fj" 和 "kl"。)

(最后我打算只使用8个字符“asdfjkl;”并将字符对设置为实际字母。(在这种替换方法中,fyi,"fj" 或 "jf" 实际上是“_”(space).)

试图在 javascript 中解决这个任务,(我不知道其他语言是否可以更有效地处理它,)我尝试按以下方式使用 "split" 函数。 (免责声明,我不确定这是否 100% 完美格式化)

<textarea id="textbox"></textarea> 

<script>
var text = document.getElementById("textbox").value; //getting string from the textarea
var pairs = text.split(/(..)/).filter(String); //spliting string into pairs
if(pairs == "fj"){replace(pairs, " ")} //some sort of subsitution
</script>

此外,如果可能的话,我希望在用户键入时将替换的字符连续地直接输入文本区域,这样翻译几乎是同时发生的。 (我假设这将使用某种 setInterval() 函数?)

如果可以就我应该在javascript中使用哪些工具正确格式提供任何提示,那将非常出色;提前致谢。

如果你感兴趣,这里是我在这个项目结束时所做的完整替换列表:

语法:(X OR Y == 结果)

AJ JA = F
AK KA = V
AL LA = B
一个; ;A = Y

SJ JS = N
SK KS = M
SL LS = S
; ;S = P

DJ JD = A
DK DK = U
DL LD = D
D; ;D = G

FJ JF = _
FK KF = 我
FL LF = T
F; ;F = K

作为 SA = C
SD DS = L
DF FD = E

JK KJ = O
KL LK = R
升; ;L = Z

AD DA = -
顺丰速递 = ,
AF FA = .

JL LJ = !
K; ;K = :
j; ;J = ?

-丹尼尔·雷曼

如果您可以确信某些对总是翻译成相同的字符,那么字典对象也许可以提供帮助。

var dict = { as:"A", kl:"B", al:"C", fj:"D" ... };

并且,如果您的 'decryption' 算法是 'lazy'(评估它遇到的第一对),那么您可以遍历输入字符串。

var outputString = "", c, cl;
for (c = 1, cl = inputString.length; c < cl; c += 2) {
   outputString += dict[inputString[c-1] + inputString[c]] || "";
}

如果您的替换算法并不比简单地查找该对代表的字母复杂多少,那么这应该适合您。不需要真正的逻辑。

我已经为您的要求准备了代码。您可以在 keydown 上绑定一个函数,以允许在文本区域中键入时连续更改。

我正在使用 replacePair 方法将一对字符替换为其等效的大写表示形式。您可以在此处注入您自己的自定义逻辑。

var tb = document.getElementById('tb');
var processedLength = 0;
var pairEntered=false;
tb.onkeydown = function (e) {
    pairEntered=!pairEntered;
    if (pairEntered) {
        var nextTwoChars = this.value.substr(this.value.length - 2, 2);
        var prevPart=this.value.substr(0,this.value.length-2);
        var finalText=prevPart+ replacePair(nextTwoChars);
        this.value=finalText;
        processedLength+=2;
    }
}
function replacePair(str){
return str.toUpperCase();
}

jsfiddle:http://jsfiddle.net/218fq7t2/

已根据您的替换逻辑更新 fiddle:http://jsfiddle.net/218fq7t2/3/

难道你不能像下面那样做吗:

var text = document.getElementById("textbox").value;
for (i = 0; i <= text.length; i++) {
    if (text[i] == "j") {
         if (text[i+1] == "f") {
             pair = "jf";
             text = text.replace(pair, "_");

    }
}

这样做的目的是,在检查任何字母时,它总是会在过程中的同一步骤中检查它后面的字母。当它发现字母 i 和字母 i+1 都与您正在寻找的一对匹配时,这些字母将被替换为 space (或任何您想要的),这意味着当 for 循环到达next 运行 找到一对后,文本字符串的大小将减少一个。因此,当它增加 i 时,它会自动跳过构成找到的对的第二个组成部分的字母。因此,"jfkl" 将被识别为两个不同的对,您的算法将不会混淆。

当然,您还必须在另一个 pairs/codewords 中工作到 for 循环中,以便它们都以某种方式进行检查

我希望我之前的回答足以让您入门。我只是提供了一种算法,您可以根据自己的喜好使用它(将其包装在一个函数中并添加您自己的事件侦听器等)。

这是您问题的解决方案。我没有写整本词典。您需要完成它。

var dictionary = { "aj":"F", "ja":"F", "ak":"V", "ka":"V", "al":"B", "la":"B", "a;":"Y", ";a":"Y" }

var input, output;

function init() {
  input = document.getElementById("input");
  output = document.getElementById("output");
  
  input.addEventListener("keyup", decrypt, false);
}

function decrypt () {
  if (!input || !output) {
    return;
  }
  
  var i = input.value, o = "", c, cl;
  
  for (c = 1, cl = i.length; c < cl; c += 2) {
    o += dictionary[ i[c-1] + i[c] ] || "";
  }
  
  while (output.hasChildNodes()) {
    output.removeChild(output.firstChild);
  }
  output.appendChild(document.createTextNode(o));
}

window.addEventListener("load", init, false);
<textarea id="input"></textarea>
<div id="output"></div>