Применение 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) равна той же длине, что и количество отображаемых символов.