String 在字符串中应用退格

String 在字符串中应用退格,string,matlab,String,Matlab,我有一个包含退格的字符串。将其显示到命令行将“应用”退格,以使其前面的每个退格和非退格字符都看不到: >> tempStr = ['aaab', char(8)] tempStr = aaa 然而,删除操作仅在显示字符串时发生。它仍然具有退格字符和“b”: >> length(tempStr) ans = 5 我正在寻找一个应用退格操作的最小(最好是某种内置的字符串处理)函数: >>f(tempStr) ans = 'aaa' 知道我在字母“a”到

我有一个包含退格的字符串。将其显示到命令行将“应用”退格,以使其前面的每个退格和非退格字符都看不到:

>> tempStr = ['aaab', char(8)]
tempStr =
aaa
然而,删除操作仅在显示字符串时发生。它仍然具有退格字符和“b”:

>> length(tempStr)
ans =
 5
我正在寻找一个应用退格操作的最小(最好是某种内置的字符串处理)函数:

>>f(tempStr)
ans = 
 'aaa'

知道我在字母“a”到“z”加上“”和backspace上有一个enumerations类也可能会有所帮助(以存储我自己的字母索引、与每个字母相关的图像等)。将这个退格移除操作作为作用于其对象向量的超类的一种方法将是非常有意思的。

您可以使用一个简单的函数,使用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
这并不是真正的“最小”,但就我所知,我认为在Matlab中使用正则表达式是不可行的


最好的方法是,使用正则表达式可以非常优雅地解决您的问题:

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
applyBackspaces(tempStr)
显示相同的字符串,但
applyBackspaces(tempStr)
的长度与显示的字符数相同

所以类似于
newStr=regexprep(tempStr,expression')其中
表达式=['\w',字符(8)]?非常接近,谢谢!当我以退格或双退格开始时怎么样<代码>tempStr=[char(8),'aaabb',char(8),char(8)]
但是如果你从一个退格开始,tehre没有什么可以删除的,对吗?正确,但是我仍然希望在NewsTR中删除初始退格。你可以搜索\的倍数并将其转换为\然后运行代码。同样,您可以检查字符串的开头,如果它是\,则将其删除。但是请检查regexprep的选项,可能有一些示例说明如何使用这个cleanerCool,唯一挑剔的评论是关于\\的处理。从这个问题上,我不确定是应该像您一样删除2个字符,还是只删除第一个\之前的字符(因此在您的示例中删除\\)。我想你可以检查
I
中的连续索引,然后用这种方式处理。很好,非常干净。我希望双退格删除前两个字符,我相信这个解决方案是可行的,但它依赖于strfind返回一个退格索引的升序列表(否则一个退格可能会删除另一个退格!)。如果我不能找到一个更小的解决方案,我将在下周接受这个答案。似乎有一些内置的字符串在处理某些东西(命令行输出只打印我们的结果字符串,对吗?)。非常感谢。
>> 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