在字符串中应用退格键

时间:2015-08-06 12:38:16

标签: string matlab

我有一个包含退格的字符串。将其显示到命令行将“适用”'退格,这样就不会看到每个退格区和紧接在它之前的非退格字符:

>> tempStr = ['aaab', char(8)]
tempStr =
aaa

然而,删除操作操作仅在显示字符串时发生。它仍然具有退格字符,并且其中包含'#'内部:

>> length(tempStr)
ans =
 5

我正在寻找一个应用退格操作的最小(理想情况下是某种内置的字符串处理)函数:

>>f(tempStr)
ans = 
 'aaa'

也许有助于知道我有一个字母表上的枚举类' a'到' z'加上' '和退格(以存储我自己的个人索引字母,与每个等相关联的图像)。让这个退格删除操作成为超类的一种方法,它可以作用于它的对象的矢量。

2 个答案:

答案 0 :(得分:5)

你可以使用while循环使用一个简单的函数来完成它:

function s = printb(s)

while true

    % Find backspaces
    I = strfind(s, char(8));

    % Break condition
    if isempty(I), break; end

    % Remove elements
    if I(1)==1
        s = s(2:end);
    else
        s(I(1)-1:I(1)) = [];
    end

end

并且测试给出了:

s = [char(8) 'hahaha' char(8) char(8) '!'];

numel(s)                 % returns 10

z = printb(s)            % returns 'haha!'

numel(z)                 % returns 5

这不是真正的" minimal",但就我的知识而言,我并不认为这对于Matlab中的正则表达式是可行的。

最佳,

答案 1 :(得分:1)

使用正则表达式可以非常优雅地解决您的问题:

function newStr = applyBackspaces(tempStr)
    newStr = tempStr;
    while (sum(newStr==char(8))>0)   % while there is at least one char(8) in newStr do:
        tmp    = newStr;             % work on previous result
        if (tmp(1) == char(8))       % if first character is char(8)
            newStr = tmp(2:end);     % then suppress first character
        else                         % else delete all characters just before a char(8)
            newStr = regexprep(tmp,[ '.' char(8)],'');  % as well as char(8) itself.
        end
    end
end

本质上,我的函数所做的是删除退格前的字符,直到输入字符串tempStr中没有更多的退格键。

为了测试它是否有效,我们检查输出和字符串的长度:

>> tempStr = ['abc', char(8), 'def', char(8), char(8), 'ghi']

tempStr =

abdghi

>> length(tempStr)

ans =

    12

>> applyBackspaces(tempStr)

ans =

abdghi

>> length(applyBackspaces(tempStr))

ans =

     6

因此,tempStrapplyBackspaces(tempStr)显示相同的字符串,但applyBackspaces(tempStr)的长度与显示的字符数相同。