2016-09-20 25 views
0

文字列内の3文字の単語の最初と最後の文字を大文字にすることを試みています。これまでのところ、私たちはそれがコードの最初の4行が何であるかで、その後、他の人がそれはどこでしょうようにそれを取得しようとしているので、3つの文字の単語が最初だった場所を見つけなければならなかった文字列内の3文字の単語の最初と最後の文字を大文字にする

spaces = strfind(str, ' '); 
spaces = [0 spaces]; 
lw = diff(spaces); 
lw3 = find(lw ==4); 
a3 = lw-1; 
b3 = spaces(a3+1); 
b4 = b3 + 2 ; 
str(b3) = upper(str(b3)); 
str(b4) = upper(str(b4); 

試してみました最初と最後の文字は、それらを大文字にしていますか?

+0

質問は何ですか? – excaza

+0

大文字にする 'str'の各単語の最初の文字の場所は' spaces(lw3)+ 1'ですか? – beaker

+2

[ラバーダックのデバッグ](https://en.wikipedia.org/wiki/Rubber_duck_debugging)をお勧めします。独自の変数名を難読化しません。短い変数名から何も得られない場合は、意味のあるものを使用してください。 – excaza

答えて

5

正規表現を使用して3文字の単語を識別し、regexprepと匿名関数を組み合わせて大文字と小文字を変換します。

str = 'abcd efg hijk lmn'; 

% Custom function to capitalize the first and last letter of a word 
f = @(x)[upper(x(1)), x(2:end-1), upper(x(end))]; 

% This will match 3-letter words and apply function f to them 
out = regexprep(str, '\<\w{3}\>', '${f($0)}') 

% abcd EfG hijk LmN 
0

正規表現が間違いなくあります。私はわずかに異なるルートを提案するつもりです、それはregexpiためtokenExtentsフラグを使用してインデックスを返すことです:

str = 'abcd efg hijk lmn'; 

% Tokenize the words and return the first and last index of each 
idx = regexpi(str, '(\<w{3}\>)', 'tokenExtents'); 

% Convert those indices to upper case 
str([idx{:}]) = upper(str([idx{:}])); 

ファイル交換からmatlab ipusum機能を使用して、私は平均で1000段落のランダムな文字列を生成しました単語長4 +/- 2

str = lower(matlab_ipsum('WordLength', 4, 'Paragraphs', 1000)); 

結果は5,531の3文字の単語を含む177,575文字の文字列でした。 timeitを使用してregexprepregexpiの実行時間を確認しました。tokenExtentsです。 regexpiを使用すると、より高速になります。

regexpi = 0.013979s 
regexprep = 0.14401s 
関連する問題