2010-02-23 43 views

Respuesta

21

Así, utilizando la cadena

str='the rain in spain falls mainly on the plain.' 

Basta con utilizar la función de reemplazo de expresiones regulares en Matlab, regexprep

regexprep(str,'(\<[a-z])','${upper($1)}') 

ans = 

The Rain In Spain Falls Mainly On The Plain. 

El \<[a-z] coincide con el primer carácter de cada palabra a la que se puede convertir a mayúsculas usando ${upper($1)}

Esto también funcionará usando \<\w para que coincida con el carácter al comienzo de cada palabra.

+1

+1 Muy bonito y corto. – Marcin

+1

Saludos, aunque no puedo reclamar demasiado crédito ya que es solo un ejemplo ligeramente modificado de las páginas de ayuda sobre expresiones regulares. La sección de reemplazo de cadenas proporciona un ejemplo para poner en mayúscula la primera letra de cada frase en una cadena. – Adrian

+3

Algunas personas, cuando se enfrentan con un problema, piensan "Lo sé, usaré expresiones regulares". Ahora ellos tienen dos problemas. :) – Marc

1

montón de maneras:

str = 'the rain in Spain falls mainly on the plane' 

spaceInd = strfind(str, ' '); % assume a word is preceded by a space 
startWordInd = spaceInd+1; % words start 1 char after a space 
startWordInd = [1, startWordInd]; % manually add the first word 
capsStr = upper(str); 

newStr = str; 
newStr(startWordInd) = capsStr(startWordInd) 

Más elegante/complejo - matrices de celdas, textscan y cellfun son muy útiles para este tipo de cosas:

str = 'the rain in Spain falls mainly on the plane' 

function newStr = capitals(str) 

    words = textscan(str,'%s','delimiter',' '); % assume a word is preceded by a space 
    words = words{1}; 

    newWords = cellfun(@my_fun_that_capitalizes, words, 'UniformOutput', false); 
    newStr = [newWords{:}]; 

     function wOut = my_fun_that_capitalizes(wIn) 
      wOut = [wIn ' ']; % add the space back that we used to split upon 
      if numel(wIn)>1 
       wOut(1) = upper(wIn(1)); 
      end 
     end 
end 
2

Desde Matlab viene con build in Perl, para las tareas de cada cadena o archivo de procesamiento complicados scripts de Perl se pueden utilizar. Por lo que tal vez podría usar algo como esto:

[result, status] = perl('capitalize.pl','the rain in Spain falls mainly on the plane') 

donde capitalize.pl es un script Perl de la siguiente manera:

$input = $ARGV[0]; 
$input =~ s/([\w']+)/\u\L$1/g; 
print $input; 

El código Perl fue tomado de this cuestión de desbordamiento de pila.

1
str='the rain in spain falls mainly on the plain.' ; 
for i=1:length(str) 
    if str(i)>='a' && str(i)<='z' 
     if i==1 || str(i-1)==' ' 
      str(i)=char(str(i)-32); % 32 is the ascii distance between uppercase letters and its lowercase equivalents 
     end 
    end 
end 

Menos ellegant y eficiente, más legible y fácil de mantener.

Cuestiones relacionadas