MATLAB字符串匹配函數(shù)中,應(yīng)用較多的有:findstr、strfind、strmatch、strcmp、strmcmp。這里我們大致列舉這些函數(shù)的區(qū)別與聯(lián)系
在Matlab中,這幾個函數(shù)區(qū)分如下:
(以下默認S1和S2是字符串,同樣也適用于cell細胞類型數(shù)據(jù),也就是循環(huán)對cell中每個元素分別判斷即可。)
findstr(S1,S2):尋找是否有S1和S2之間的匹配,真返回1,假返回0,雙向;
例:
s = 'How much wood would a woodchuck chuck?';
findstr(s,'a') returns 21
findstr('a',s) returns 21
findstr(s,'wood') returns [10 23]
findstr(s,'Wood') returns []
findstr(s,' ') returns [4 9 14 20 22 32]
strfind(S1,S2):尋找S2是否匹配S1,和上面的唯一區(qū)別就是這個是單向的。請注意唯一的區(qū)別在例子中紅字部分。
例:
s = 'How much wood would a woodchuck chuck?';
strfind(s,'a') returns 21
strfind('a',s) returns []
strfind(s,'wood') returns [10 23]
strfind(s,'Wood') returns []
strfind(s,' ') returns [4 9 14 20 22 32]
strcmp(S1,S2):尋找S1和S2是否完全匹配,S1和S2沒有順序的區(qū)分。
例:
s= 'wooden';
strcmp(s,'wood') returns 0
strcmp(s,'wooden') returns 1
strcmp('wooden',s) returns 1
strcnmp(S1,S2,n):尋找S1和S2的前n個字符
是否完全匹配,S1和S2沒有順序的區(qū)分。
例:
s= 'wooden';
strncmp(s,'wood',4) returns 1
strncmp(s,'wood',5) returns 0
strncmp(s,'wooden',4) returns 1
strncmp('wooden',s,4) returns 1
strcmpi(S1,S2)與strncmpi(S1,S2,n)與上面分別對應(yīng)的strcmp(S1,S2)與strncmp(S1,S2,n)完全相同,唯一的區(qū)分是匹配時不區(qū)分大小寫。
最重要的:
strmatch(S1,S2):尋找S1是否匹配S2的開頭部分,返回值是S1在S2中匹配的位置。
strmatch(S1,S2,'exact'):
尋找S1是否和S2完全匹配,返回值是S1在S2中匹配的位置。
例:
S2=strvcat('max','minimax','maximum')
S2 =
max
minimax
maximum
strmatch('max',S2) returns [1; 3] 表明1和3列匹配
strmatch('max',S2,'exact') returns [1] 表明1列完全匹配
strmatch的一個好處是可以返回匹配的位置,而其余幾個函數(shù)都只能返回判斷值。
但是,strmatch在2011b之后的版本將被刪除不再使用。根據(jù)個人推測的原因和網(wǎng)上求證如下:
1、strmatch的功能完全可以由以上的幾個函數(shù)實現(xiàn)。
2、strmatch是一個M文件,而其余幾個函數(shù)都是內(nèi)置的函數(shù),因此在執(zhí)行時,可以預(yù)測到strcmp的效率是遠遠高于strmatch的。
3、另一個因素,strmatch要先創(chuàng)建一個矩陣來儲存返回的真值的位置,且在循環(huán)的過程中這個矩陣在不斷變化;而strcmp僅僅返回真假。因此推測效率更高。
以上僅為推測,我沒有做過測試。因此對于小程序來說,這點時間效率的對比實在不會太重要。總之,還是選擇自己適合的函數(shù)就可以了。