簡體   English   中英

如何在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”的沖突說它找到了。 這對我不起作用,因為對我來說,它找不到它,因為我只想一次查看兩個字符內的發現對。 (即:“ fjkl”只能產生“ fj”和“ kl”。)

(最后,我打算僅使用8個字符“ asdfjkl; ”,並將成對的字符設置為實際字母。(在這種替換方法中,fyi,“ fj”或“ jf”實際上是“ _”(空格)。 )

在嘗試用javascript找出此任務時,(我不知道其他語言是否可能更有效地處理它),我嘗試通過以下方式利用“拆分”功能。 (免責聲明,我不確定該格式是否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; ; S = P

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

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

AS SA = C
SD DS = L
DF FD = E

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

AD DA =-
SF FS =,
AF FA =。

JL LJ =!
k; ; K =:
焦耳; ; J =?

-丹尼爾·雷曼(Daniel Rehman)

如果可以確定某些對總是轉換為同一字符,那么詞典對象可能會有所幫助。

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

而且,如果您的“解密”算法是“惰性”(評估它遇到的第一對),那么您就可以遍歷輸入字符串。

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

如果您的替換算法沒有比簡單地查找配對代表的字母更復雜,那么對您來說應該可以。 不需要真正的邏輯。

我已經為您准備了代碼。 您可以在按下鍵盤時綁定功能,以允許您在文本區域中鍵入內容時進行連續更改。

我正在使用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/

根據您的替換邏輯更新了小提琴: 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都與您要尋找的一對匹配時,字母將被一個空格(或您想要的任何空格)替換,這意味着當for循環在a之后到達下一個運行時如果找到一對,則文本字符串的大小將減小一倍。 因此,當它增加i時,它將自動跳過組成找到的對的第二個成分的字母。 因此,“ jfkl”將被標識為兩個不同的對,並且不會混淆您的算法。

當然,您還必須將其他對/代碼字放入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> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM