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