- MATLAB从基础到精通
- 王薇编著
- 2639字
- 2020-08-28 06:53:08
2.4 字符串
MATLAB中提供了字符串类型用于处理文本等字符型数据。字符串可以理解为字符的数组,而字符在MATLAB存储空间中又与相应的ASCII码对应。
2.4.1 字符串的生成
字符串的生成主要是通过直接赋值法、已有字符串的连接和其他数据类型的转换三种形式。其中其他数据类型的转换将在本章2.7节中详细叙述。
1.一维字符串
在一对单引号的中间放置字符数据,即构成字符串类型的数据。字符串类型的数据每个字符占2字节的存储空间。
【例2.6】一维字符串的生成。
(1)直接赋值法。
>>str1='ABCDEF'; %定义字符串str1,其中的字符数据为ABCDEF >> class(str1) % str1的数据类型为字符串 ans = char >> whos str1 %每个字符占2字节的存储空间 Name Size Bytes Class str1 1x6 12 char array Grand total is 6 elements using 12 bytes
(2)连接法,可以通过连接函数strcat()或者连接符“[ ]”。
>> str2=strcat(str1,'STR') %strcat()函数用于水平连接字符串变量str1和字符串“STR” str2 = ABCDEFSTR >> str2=strcat('STR ',str1) %注意使用strcat()函数连接时,字符串末尾的空格会自动去除 str2 = STRABCDEF >> str3=[str1,str2] %使用连接符“[ ]”连接字符串 str3 = ABCDEFABCDEFSTR >> str2=['STR ',str1] %注意使用连接符“[ ]”连接时,字符串末尾的空格不去除 str2 = STR ABCDEF
2.二维字符串
二维字符串的生成方法与一维类似,不过使用连接符“[ ]”连接时,二维字符串要求每行的字符有相同的列数,如果每行列数不同会报错,此时可以通过填空补足。
【例2.7】二维字符串的生成。
>> str1=['ABC';'ab'] %连接的字符串列数不同,程序报错 ??? Error using ==> vertcat All rows in the bracketed expression must have the same number of columns. >> str1=['ABC';'ab '] %通过字符串末尾填空,保持字符串每行列数相同 str1 = ABC ab >> str2=char('ABC','ab') % char()创建二维字符串,列数不同的字符行,末尾自动留空 str2 = ABC ab >> whos str1 str2 %字符串str1和str2在内存中占相同的存储空间 Name Size Bytes Class str1 2x3 12 char array str2 2x3 12 char array Grand total is 12 elements using 24 bytes >> str3=strvcat(str1,str2) %垂直连接字符串str1和str2 str3 = ABC ab ABC ab
2.4.2 字符串操作函数
字符串类型变量无论在任何编程环境中都是经常使用的,而MATLAB已为用户提供了丰富的函数直接处理字符串,包括字符串的判断、访问、查找、替换、比较、大小写转换、执行。下面详细介绍这些操作的实现。
1.字符串的判断
● ischar(s):判断变量s的数据类型是否为字符串,返回结果为逻辑变量,如果是则为“1”,否则为“0”。
● isletter(s):判断字符串s中每个字符元素是否为字母,返回结果为逻辑型的向量,“1”代表字符串相应位置的元素为字母,“0”代表字符串相应位置的元素不为字母。
● isspce(s):判断字符串s中每个字符元素是否为空格,返回结果为逻辑型的向量,“1”代表字符串相应位置的元素为空格,“0”代表字符串相应位置的元素不为空格。
【例2.8】字符串的判断。
>> str1=['A B123','CD 5 '] %字符串生成 str1 = A B123CD 5 >> ischar(str1) %判断数据的数据类型是否为字符串 ans = 1 >> isletter(str1) %判断字符串中每个字符元素是否为字母 ans = 1 0 1 0 0 0 1 1 0 0 0 0 >> isspace(str1) %判断字符串中每个字符元素是否为空格 ans = 0 1 0 0 0 0 0 0 1 1 0 1
2.字符串的访问
字符串中相应字符的访问是通过下标法来实现的,即根据字符元素在字符串中的位置来访问,其中位置的确定包括行列坐标和线性索引坐标两种方式。在MTALAB中字符数组是按列存储的。
【例2.9】字符串的访问。
>> str1=char('abc','d f',' 1ee3 '); %生成字符串 >> str1 str1 = abc d f 1ee3 >> str1(1,:) %访问字符串中的第1行元素 ans = abc >> str1(1,2) %访问字符串中的第1行第2列元素 ans = b >> str1([1,2]) %按线性索引访问 ans = ad >> str1([1,2],[2,3]) %按行列坐标索引访问 ans = bc f
3.字符串的查找和替换
● k = strfind(str, s):在字符串str中查找字符s,如存在则返回字符在字符串str中出现的下标,没有返回的k为空矩阵。
● k = findstr(s1, s2):函数查找与被查找元素与其在函数中的顺序无关,即函数findstr(s1, s2)与findstr(s2, s1)结果是一样的,在长字符串中查找短字符串,存在则返回字符在字符串中出现的下标,没有返回的k为空矩阵。
● str=strrep(s1,s2,s3):在字符串s1中查找字符串s2并将其替换为字符串s3。
● i = strmatch(s1,s2):在字符串s1中匹配查找与字符串s2起始一致的字符行,返回行号。
● i = strmatch(s1,s2,’exact’):在字符串s1中匹配查找与字符串s2完全一致的字符行,返回行号。
【例2.10】字符串的查找和替换。
>> str1='Specify character data by placing characters inside a pair of single quotes'; >> k = strfind(str1, 'ar') %在字符串str1中查找字符串“ar”,返回其在字符串中出现的位置 k = 11 37 >> k = strfind(str1, 'are') %在字符串str1中查找字符串“are”,如果不存在,则返回空矩阵 k = [] >> k = findstr(str1, 'ar') %在字符串str1中查找字符串“ar”,返回其在字符串中出现的位置 k = 11 37 >> k = findstr('ar',str1 ) %颠倒查找函数中的字符串顺序后,结果是一样的 k = 11 37 >> str=strrep(str1,'ar','are') str = Specify chareacter data by placing chareacters inside a pair of single quotes >> i = strmatch('min', strvcat('min', 'minimax', 'maximum')) %字符串中匹配查找 i = 1 2 >> i = strmatch('min',strvcat('min','minimax','maximum'),'exact')%字符串中精确的匹配查找 i = 1
4.字符串的比较
● k=strcmp(s1,s2):比较字符串s1和s2是否相同,如果相同则返回逻辑变量“1”,如果不相同则返回“0”。
● k=strncmp(s1,s2,n):比较字符串s1和s2前n个字符是否相同,如果相同则返回逻辑变量“1”,如果不相同则返回“0”。
● k=strcmpi(s1,s2):比较字符串s1和s2是否相同,不区分字符串字母的大小写,相同则返回逻辑变量“1”,不相同则返回“0”。
【例2.11】字符串的比较。
>> str1='ABC'; >> str2='ABC'; >> str3='abc'; >> str4='ABCD'; >> k1=strcmp(str1,str2) %比较字符串st1和str2是否相同,如果相同,则返回“1” k1 = 1 >> k2=strcmp(str1,str3) %比较字符串st1和str3是否相同,如果不相同,则返回“0” k2 = 0 >> k3=strcmpi(str1,str3) %不区分大小写,比较字符串st1和str3是否相同,如果相同则返回“1” k3 = 1 >> k4=strncmp(str1,str4,3) %比较字符串st1和str2前3个字符是否相同,如果相同,则返回“1” k4 = 1
5.字符串的大小写转换
● str=lower(s):将字符串s中的大写英文字母全部转换为小写。
● str=upper(s):将字符串s中的小写英文字母全部转换为小写。
【例2.12】字符串的大小写转换。
>> str1='asDD ssDD , kDEF'; >> str=lower(str1) %将字符串str1中的大写英文字母全部转换为小写 str = asdd ssdd , kdef >> str=upper(str1) %将字符串str1中的小写英文字母全部转换为大写 str = ASDD SSDD , KDEF
6.字符串的执行
eval()函数可用于字符串表达式的执行,函数的具体用法如下。
● eval(expression):用于在命令行执行expression中的字符串表达式。
● [a1,a2,a3,...] = eval(‘function(b1,b2,b3,...)’):其中“function(b1,b2,b3,...)”为待执行的字符串表达式,“a1,a2,a3,...”为字符串表达式的输出结果。
【例2.13】字符串的执行。
>> A=rand(3); >> eval('length(A)') %执行求取矩阵A长度的字符串表达式 ans = 3 >> [I,J]=eval('size(A)') %执行求取矩阵A大小的字符串表达式,返回结果为矩阵A的行、列数 I = 3 J = 3 >> for i=1:3 %代码实现分别给变量a1、a2、a3赋值 eval(['a',num2str(i),'=2*i']) end a1 = 2 a2 = 4 a3 = 6
7.字符串的空格操作相关函数
● str=strtok(s):查找字符串第一个空格前的字符,返回到字符串str中。
● str=deblank(s):去除字符串s末尾的空格,返回去除空格的字符串str。
● str = strtrim(s):删除字符串s头尾的空格,返回去除空格的字符串str。
● blanks(n):生成含n个空格的字符串。
【例2.14】字符串的空格操作。
>> str1='AABB CCDD EEFF '; >> str2=strtok(str1) %返回字符串str1第一个空格前的字符 str2 = AABB >> str3=deblank(str1) %去除字符串末尾的空格,原字符串长度为16,去除空格后为14 str3 = AABB CCDD EEFF >> length(str1) ans = 16 >> length(str3) ans = 14 >> str4=' AABB CCDD EEFF '; >> str5=strtrim(str4) %去除字符串头、尾的空格,原字符串长度为18,去除空格后为14 >> str5 str5 = AABB CCDD EEFF >> length(str4) ans = 18 >> length(str5) ans = 14 >> str6=[str5,blanks(3),str5] %字符串中添加3个空格 str6 = AABB CCDD EEFF AABB CCDD EEFF