2012-08-09 31 views
7

我得到f类似的JavaScript CONCAT字符串退格

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

功能现在,我要使用JavaScript特殊的性格特征“\ B”以这样的方式,我可以选择,如果我想显示的硬编码字符串“abc”或不。例如,

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

我试过相同,但它不工作。换句话说,我想用一个退格字符连接一个字符串,这样我就可以从字符串中删除最后一个字符。

我们能做到这一点在JavaScript?

编辑 真正的代码是太多大(其一个巨大的1个内衬concats很多很多的字符串)。为了映射上面的例子,我们不能编辑函数f,所以做任何你想从函数f外部得到的东西。

+1

是的,我们能做到这一点。虽然我不能“给予编码”。一种方法是分析传递给函数的'str',捕获'\ b's并执行一些字符串操作。 – kapa 2012-08-09 20:46:10

+2

非常有趣的问题。我急于看到答案。 – 2012-08-09 20:46:30

+2

传递一个索引在哪里连续。负指数将切片更早 – mplungjan 2012-08-09 20:49:00

回答

6

的问题来自于一个事实,即\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”);'returns'yz' – Wesley 2012-08-09 21:05:22

+2

我假设正则表达式支持'\ b'。它没有。看我的编辑。 – 2012-08-09 21:06:01

+2

很酷的小提琴,你能解释一下正则表达式吗?我太高,无法理解这一点。 – riship89 2012-08-09 21:08:04

1

编辑:我意识到这可能不是什么OP一直在寻找,但它绝对是在大多数情况下一个字符串的结尾删除字符更简单的方法。

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

1

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

如果你试试这个:

的console.log( 'ABC \ B \ BYZ');

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

这意味着,它不是concatentation的功能,但在方法的根本错误。

我会修改你的方法来使用SubString,然后采取\ b的索引和切出以前的字符。

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

当我尝试验证时抛出一个错误。 – Wesley 2012-08-09 21:02:31

+1

@韦斯利看看编辑是否修正..我错误的问题 – 2012-08-09 21:05:42

+1

@韦斯利实际上,*现在*检查我的编辑。忘了另一件事 – 2012-08-09 21:07:26