【问题标题】:JavaScript concat string with backspaceJavaScript 用退格键连接字符串
【发布时间】:2012-08-09 20:43:48
【问题描述】:

我有一个函数 f 类似于

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

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

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

我也试过了,还是不行。换句话说,我想将一个字符串与一个退格字符连接起来,这样我就可以从字符串中删除最后一个字符。

我们可以在 JavaScript 中做到这一点吗?

编辑 真正的代码太大了(它是一个连接许多字符串的 HUGE 1 衬垫)。为了在上面的例子中映射它,我们不能编辑函数 f,所以你可以从函数 f 之外做任何你想做的事情。

【问题讨论】:

  • 是的,我们可以做到。不过,我不能“给密码”。一种方法是分析传递给函数的str,捕获\bs 并进行一些字符串操作。
  • 非常有趣的问题。我急于看到答案。
  • 传递要连接的索引。负索引会更早切片
  • 你试过f("\b\byz")吗?
  • @DGH:是的,我做了,上面写着“abcyz”

标签: javascript string concatenation backspace


【解决方案1】:

问题在于\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"

【讨论】:

  • 不错的主意,但我发现这执行不正确。例如,RemoveBackspaces("abcde\b\b"+"yz"); 返回 'yz'
  • 很酷的小提琴,你能解释一下那个正则表达式吗?我太高了,无法理解。
  • 正则表达式匹配任何字符 (.) 后跟一个退格 (\x08),并将所有这些匹配项替换为空字符串。
  • 很酷..谢谢。如果我没有从外部函数 f 得到解决我的问题的答案,我会接受这个。
  • @hrishikeshp19 这确实在函数之外工作。只需在函数返回的字符串上调用它。
【解决方案2】:

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

您可能应该只使用string.substringstring.substr,它们都返回字符串的一部分。您可以获取从 0 到字符串长度减 2 的子字符串,然后将其与“yz”或其他任何内容连接。

【讨论】:

    【解决方案3】:

    有趣的问题。我首先检查了一些关于 JS 中 \b 的假设。

    如果你试试这个:

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

    你会得到与“abcyz”相同的答案。

    这意味着,它不是连接的函数,而是方法中的一个基本错误。

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

    【讨论】:

      【解决方案4】:

      类似这样的:

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

      【讨论】:

      • 还没有,f("abcde\b\b"+"yz"); 返回“ababcdeyz”
      • Saem thing f("ab\b\b"+"yz"); 返回“ababyz”
      • @Wesley,但它不会像你尝试的那样工作。它应该从存储的abc中删除。如果用户想要那样,我会写它,但我不完全明白其中的意义,lol
      【解决方案5】:

      我正在处理退格键\b,但它总是在\x1B[K 之后的\x1B[K 行中有ANSI 擦除。所以我要做的是:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-29
        • 2020-01-21
        • 2013-10-13
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        相关资源
        最近更新 更多