我有一个包含退格的字符串。将其显示到命令行将“适用”'退格,这样就不会看到每个退格区和紧接在它之前的非退格字符:
>> tempStr = ['aaab', char(8)]
tempStr =
aaa
然而,删除操作操作仅在显示字符串时发生。它仍然具有退格字符,并且其中包含'#'内部:
>> length(tempStr)
ans =
5
我正在寻找一个应用退格操作的最小(理想情况下是某种内置的字符串处理)函数:
>>f(tempStr)
ans =
'aaa'
也许有助于知道我有一个字母表上的枚举类' a'到' z'加上' '和退格(以存储我自己的个人索引字母,与每个等相关联的图像)。让这个退格删除操作成为超类的一种方法,它可以作用于它的对象的矢量。
答案 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
因此,tempStr
和applyBackspaces(tempStr)
显示相同的字符串,但applyBackspaces(tempStr)
的长度与显示的字符数相同。