JavaScript如何使用反斜杠将字符串拼接?

11

我有一个类似于以下函数的函数 f

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

现在,我想使用 JavaScript 中的特殊字符 "\b",以这样一种方式,我可以选择是否要显示硬编码的字符串 "abc"。例如:

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

我尝试过同样的方法,但它不起作用。换句话说,我想将一个字符串与一个退格字符连接起来,以便我可以从字符串中删除最后几个字符。

我们能在JavaScript中实现这个吗?

编辑 真正的代码太长了(它是一个巨大的1行代码,连接了许多字符串)。为了将其映射到上面的示例中,我们不能编辑函数f,因此您可以在函数f之外做任何您想做的事情。


1
可以的。但我不能“给出代码”。一种方法是分析传递给函数的 str,捕获 \b 并进行一些字符串操作。 - kapa
2
非常有趣的问题。我迫不及待地想看到答案。 - Erty Seidohl
2
传递一个索引以进行连接。负索引将切片早期。 - mplungjan
1
你尝试过 f("\b\byz") 吗? - DGH
1
@DGH:是的,我做到了,它显示“abcyz”。 - hrishikeshp19
显示剩余2条评论
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"

1
不是一个坏主意,但我发现这并不能正确执行。例如:RemoveBackspaces("abcde\b\b"+"yz"); 返回 'yz'。 - Wesley
4
挺不错的代码,你能稍微解释一下这个正则表达式吗?我现在有点飘了理解不了。 - hrishikeshp19
2
正则表达式匹配任何字符(.)后跟一个退格符(\x08),并用空字符串替换所有这些出现。 - Kendall Frey
非常酷..谢谢。如果我在函数f之外没有得到解决我的问题的答案,我会接受这个答案的。 - hrishikeshp19
如果你把\b放在字符类中,例如[\b],那么它就可以表示退格符号。请参考这个问题 - 4castle
显示剩余5条评论

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

1
还没有,f("abcde\b\b"+"yz"); 返回 "ababcdeyz"。 - Wesley
1
相同的代码 f("ab\b\b"+"yz"); 返回 "ababyz"。 - Wesley
@Wesley,但是你尝试的方式行不通。它应该从存储的abc中删除。如果用户希望这样,我会写出来,但我并不完全明白其中的意义,哈哈。 - Phillip Schmidt

1

编辑:我意识到这可能不是楼主想要的,但对于大多数情况来说,这绝对是从字符串末尾删除字符的更简单方法。

您应该只使用string.substringstring.substr,两者都返回字符串的一部分。 您可以从 0 到字符串长度减去 2 的位置获取子字符串,然后将其与 "yz" 或其他内容连接起来。


1
有趣的问题。我首先检查了JS中\b的一些假设。
如果你尝试这个:

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

你会得到同样的答案'abcyz'。

这意味着,它不是串联函数的问题,而是方法本身存在根本错误。

我会修改你的方法,使用SubString,然后取\b的索引并切掉前一个字符。


0

我正在处理退格键\b,但每次都会在\b后面有一个ANSI擦除行的代码\x1B[K。 所以我做的是:

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

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