2015-08-06 4 views
10

Ho una stringa che include backspace. Visualizzarlo alla linea di comando si 'applica' le backspaces tale che ogni backspace e il carattere non backspace immediatamente precedente non può essere visto:Applicare backspace all'interno di una stringa

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

Tuttavia l'operazione operazione di cancellazione avviene solo quando si visualizza la stringa. Ha ancora il carattere backspace, e la 'b', al suo interno:

>> length(tempStr) 
ans = 
5 

Sto cercando un minimo (idealmente una sorta di elaborazione delle stringhe incorporato) funzione che applica l'operazione backspace:

>>f(tempStr) 
ans = 
'aaa' 

Può anche essere utile sapere che ho una classe di enumerazioni sopra l'alfabeto 'a' a 'z' plus '' e backspace (per memorizzare la mia indicizzazione personale delle lettere, le immagini associate a ciascuna ecc.). Sarebbe verissimo che questa operazione di rimozione backspace sia un metodo della superclasse che agisce su un vettore dei suoi oggetti.

+2

quindi qualcosa come 'newStr = regexprep (tempStr, expression, '');' dove 'expression = ['\ w', char (8)];'? – schvaba986

+0

Questo è molto vicino, grazie! Che ne dici di quando inizio con un backspace o un doppio backspace? 'tempStr = [char (8), 'aaabb', char (8), char (8)];' – eretmochelys

+0

Ma se inizi con un backspace, tehre non è nulla da eliminare, vero? –

risposta

5

È possibile farlo con una semplice funzione utilizzando un ciclo 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 

e la prova ha dato:

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

numel(s)     % returns 10 

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

numel(z)     % returns 5 

Questo non è davvero "minimal", ma per quanto riguarda il mio knowlegde non penso che sia fattibile con le espressioni regolari in Matlab.

migliore,

+0

Cool, l'unico commento nitido sarebbe relativo alla gestione di \\. Non sono sicuro dalla domanda se si debba rimuovere 2 caratteri come fai tu o solo quello prima del primo \ (quindi rimuovi un \\ nel tuo esempio). Immagino che potresti controllare gli indici consecutivi in ​​'I' e gestirli in questo modo. – schvaba986

+0

Bello, molto pulito. Speravo di avere il doppio backspace per rimuovere i due caratteri precedenti, credo che questa soluzione funzioni ma si basa su strfind che restituisce una lista crescente di indici backspace (altrimenti un backspace potrebbe cancellare un altro backspace!). Accetterò questa risposta la prossima settimana se non riesco a trovare una soluzione più piccola. Sembrava che ci potesse essere qualcosa di elaborazione incorporata in qualcosa (l'output della riga di comando sta stampando solo la nostra stringa risultante, giusto?). Grazie! – eretmochelys

1

Il tuo problema può essere risolto in maniera molto elegante utilizzando le espressioni regolari:

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 

In sostanza, quello che la mia funzione non fa altro che eliminare il carattere appena prima che il backspace fino a quando non ci sono più backspaces in la stringa di input tempStr.

Per testare se funziona, controlliamo la produzione e la lunghezza della stringa:

>> 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 

Quindi, tempStr e applyBackspaces(tempStr) mostrano la stessa stringa, ma applyBackspaces(tempStr) è la stessa lunghezza come il numero di caratteri visualizzati .