11

私は次のような関数fを持っています

function f(str){
    alert("abc"+str);
}

ここで、JavaScriptの特殊文字「\ b」を使用して、ハードコードされた文字列「abc」を表示するかどうかを選択できるようにします。例えば、

f("\b\b"+"yz"); //should output "ayz"

同じことを試しましたが、機能しません。つまり、文字列から最後の文字を削除できるように、文字列をバックスペース文字と連結したいと思います。

これをJavaScriptで実行できますか?

編集 実際のコードは大きすぎます(多くの多くの文字列を連結する巨大な1ライナー)。上記の例でそれをマッピングするには、関数fを編集できないため、関数fの外部から必要な操作を行います。

4

5 に答える 5

10

\b問題は、ASCIIコードの単なる別の文字であるという事実に起因します。特別な動作は、テキスト端末などの文字列リーダーによって実装された場合にのみ発生します。

バックスペースの動作を自分で実装する必要があります。

function RemoveBackspaces(str)
{
    while (str.indexOf("\b") != -1)
    {
        str = str.replace(/.?\x08/, ""); // 0x08 is the ASCII code for \b
    }
    return str;
}

例: http: //jsfiddle.net/kendfrey/sELDv/

次のように使用します。

var str = RemoveBackspaces(f("\b\byz")); // returns "ayz"
于 2012-08-09T21:01:57.190 に答える
1

編集:これはOPが探していたものではない可能性があることに気付きましたが、ほとんどの場合、文字列の末尾から文字を削除する方が間違いなく簡単な方法です。

おそらく、string.substringまたはstring.substrを使用する必要があります。どちらも文字列の一部を返します。0から文字列の長さから2を引いたものまでの部分文字列を取得し、それを「yz」などと連結することができます。

于 2012-08-09T20:48:09.623 に答える
1

興味深い質問です。私は最初にJSの\bに関するいくつかの仮定を確認しました。

これを試してみると:

console.log('abc \ b \ byz');

'abcyz'と同じ答えが得られます。

これは、連結の機能ではなく、アプローチの根本的なエラーであることを意味します。

SubStringを使用するようにアプローチを変更してから、\ bのインデックスを取得し、前の文字を切り取ります。

于 2012-08-09T20:48:42.967 に答える
1

このようなもの:

function f(str, abc){
   if(!abc) abc = "abc";
   if (str.indexOf("\b") != "undefined")
   {
       abc = abc.slice(0,-1);
       str = str.replace("\b","");
       f(str, abc);
   }
   else alert(abc+str);
}

追加のボーナスとして、再帰を使用できるようになります。

これは、この方法よりも少し遅いことに注意してください。

function f(str){
    var count = 0;
    var abc = "abc";
    for(var i = 0; i < str.length; i++)
    { 
       if(str[i] = "\b") //at least i think its treated as one character...
       count++;
    }
    abc = abc.slice(0, count * -1);
    alert(abc+str);
}
于 2012-08-09T20:54:54.003 に答える
0

バックスペースを処理していますが、sの後\bに常にANSI消去が並んでいます。だから私がすることはこれです:\x1B[K\b

function applyBackspaces(str) {
  // Catch character + \b or character + \b\x1B[K and delete it
  const re = /.?[\u0008](\u001b\[K)?/
  while (re.test(str)) {    
    str = str.replace(re, "");
  }
  return str;
}

// wrote "up", backspace+erase, backspace+erase (used backspace key)
// wrote "ls", backspace+backspace+erase (used clear line command C-u)
// wrote uptime
applyBackspaces('up\b\x1B[K\b\x1B[Kls\b\b\x1B[Kuptime') // uptime
于 2022-02-11T13:24:19.117 に答える