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

问题来自这样一个事实,即\bASCII 代码中的另一个字符。特殊行为仅在由某些字符串阅读器(例如文本终端)实现时。

您需要自己实现退格行为。

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.substringor 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

我正在处理 backspace \b,但它总是在s\x1B[K之后有 ANSI 擦除。\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 回答