Применение backspace внутри строки
У меня есть строка, которая включает backspace. Отображение его в командной строке "применит" обратные пространства так, что каждое обратное пространство и символ без обратного пробела, который непосредственно предшествует ему, не могут быть видны:
>> tempStr = ['aaab', char(8)]
tempStr =
aaa
Однако операция операции удаления происходит только при отображении строки. Он по-прежнему имеет обратный символ и "b" внутри него:
>> length(tempStr)
ans =
5
Я ищу минимальную (в идеале некоторую функцию строковой обработки), которая применяет операцию backspace:
>>f(tempStr)
ans =
'aaa'
Это также может помочь узнать, что у меня есть класс перечислений по алфавиту 'a' to 'z' plus '' и backspace (для хранения собственной личной индексации букв, изображений, связанных с каждым и т.д.). Было бы достаточно, чтобы эта операция удаления backspace была методом суперкласса, который действует на вектор его объектов.
Ответы
Ответ 1
Вы можете сделать это с помощью простой функции, используя цикл 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.
Бест,
Ответ 2
Ваша проблема может быть решена очень элегантно, используя регулярные выражения:
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)
равна той же длине, что и количество отображаемых символов.