2016-09-20 132 views
0

我想大寫字母中只有三個字母單詞的第一個和最後一個字母。到目前爲止,我已經嘗試大寫字母中的三個字母單詞的第一個和最後一個字母

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

我們必須找到其中的3個字母的單詞是第一所以這就是第4行代碼,然後其他人都試圖得到它,這樣它會發現哪裏第一個和最後一個字母是,然後大寫他們?

+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

正則表達式肯定是要走的路。我要提出一個稍有不同的路線,那就是返回使用tokenExtents標誌指數regexpi

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

結果是177,575個字符串,包含5,531個3個字母的單詞。我使用timeit來檢查使用regexprepregexpitokenExtents的執行時間。使用regexpi的速度要快一個數量級:

regexpi = 0.013979s 
regexprep = 0.14401s 
相關問題