2.5 字符串操作
在许多计算机高级语言中,字符串处理一向是作为非常重要的部分。由于MATLAB注重矩阵的计算和处理,因此字符串在MATLAB中的重要性比在其他高级语言中略低一些,但MATLAB处理字符串的功能还是非常强大的,它提供了完善的处理字符串的函数,如对字符串进行比较、取子串等。同样,MATLAB对字符串的操作也是建立在矩阵处理的基础上的,读者可以从以下的内容中仔细体会。
2.5.1 MATLAB中的字符串符号
在MATLAB中,要建立一个字符串变量,可以写成S='字符串',即用' '将输入的字符串括起来,注意不是" ",这与其他的一些高级语言不同。而要建立一个字符串矩阵,则输入如下。
SA=['string11' 'string12' …
'string21' 'string22' …
'stringn1' 'stringn2' …]
与数组不同,字符串矩阵的每一行字符串的个数可以不同,但是每一行的所有字符串中字符的总个数必须相同,如果不满足这个条件,即使每行中字符串的个数相同,也会出错。事实上,MATLAB将一行内的所有字符串都合并起来,构成一个字符串,单个字符串之间不加空格,这正是每行中输入的字符串的个数可以不相同的根本原因,如下面一段程序。
>> SA=['hello';'world';'
我是李某某']
SA =
hello
world
我是李某某
利用这个特点,可以用[ ]将任意字符串连接起来。
将上例中SA
的上下两行连接起来,操作如下。
>> [SA(1,:) SA(2,:) SA(3,:)]
ans =
helloworld我是李某某
MATLAB将字符串当作行向量,每个元素对应一个字符;也就是说字符串存在一个行向量中,向量的每个元素对应一个字符。
>> size(s)
ans =
1 11
例2.24 用whos命令查看字符串属性。
>> whos
Name Size Bytes Class
SA 2x16 64 char
ans 1x2 16 double
area 1x1 8 double
c 1x10 20 char
d 1x18 36 char
s 1x11 22 char
>> class(s)
ans =
char
>> c='It''s a dog' %字符串内为两个',而不是"
c =
It's a dog
>> d='She said:”I am OK”' %字符串内为两个",而不是两个'
d =
She said:”I am OK”
MATLAB在处理字符串矩阵时是把它当作数据矩阵来处理的,字符串中的每个字符都是矩阵的元素,这样字符串矩阵也应当满足数据矩阵的所有条件,即要求每行的元素个数必须相同,上下两行的字符总数必须相同。
字符串的标识方法和数值向量或矩阵的标识方法相同,也就是可以对元素进行提取或重新赋值的操作,如下面一段程序。
>> s1='My name is
李某某'
s1 =
My name is 李某某
>> s1(12)
ans =
李
>> s2=s1(end:-1:1)
s2 =
某某李 si eman yM
2.5.2 一般通用字符串操作
通用字符串操作包括字符串与ASCII码间的转换、字符串与数据间的转换、字符串大小写间的转换、字符串中空格的删除等,这些操作都是非常常用和基本的字符串操作。其他高级语言中的字符串操作一般都含有这些操作,因而可以称之为通用字符串操作。
1.将整数数组转换为字符串
s=string(A
):其中A
为正整数数组,这个函数的作用是将整数数组转换为字符串,字符串中字符的ASCII码即A
中相应的元素值。
例2.25 string()函数的用法。
>> a=[84 104 105 115 32 105 115 32 97 110 32 101 120 97 109 112 108 101]
a =
Columns 1 through 9
84 104 105 115 32 105 115 32 97
Columns 10 through 18
110 32 101 120 97 109 112 108 101
>> string(a)
ans =
This is an example
>> b=[1 2 3 4 5 6;81 72 58 124 112 114]
b =
1 2 3 4 5 6
81 72 58 124 112 114
>> string(b)
ans =
/
QH:|pr
利用string()函数可以将任意整数数组转换为相应的字符串。
2.将ASCII码转换为字符串矩阵
char(A
):此函数将由正整数组成的矩阵A
转换为字符串矩阵,矩阵A
的元素的范围一般为0~65535,超出这个范围的是没有定义的,但也可以显示出结果,只是系统会给出超出范围的警告。
s=char(C
):如果C
是由字符串组成的单元矩阵,此函数将单元矩阵C
转换为字符串矩阵,字符串矩阵的每行就是单元矩阵的每个元素,且用空格将每个字符串补齐,以保证字符串矩阵的合法性。也可以用cellstr()函数将一个字符串矩阵转换为一个字符串单元矩阵。
s=char(s1
,s2
,s3
,…):此函数以各个字符串是s
1
,s
2
,s
3
,…为每行构成字符串矩阵S
,并自动以适当的空格追加在较短的字符串的后面,使各行的字符串的字符个数相同,以构造合法的字符串矩阵。参数中的空字符串也会被空格填充为相同大小的空格字符串。
例2.26 char()函数的用法。
>> s={'My' 'name' 'is' '
李某某'}
s =
'My' 'name' 'is' '李某某'
>> k=char(s)
k = %k的每行字符串都用空格补成长度相同的
My
name
is
李某某
>> cellstr(k) %将字符串矩阵转换为单元矩阵
ans =
'My'
'name'
'is'
'李某某'
3.将字符串转换成ASCII码
abs(S
):S
为字符串,此函数返回S
的每个字符的ASCII码,结果是一个整数矩阵,可以当作一般的矩阵处理。
例2.27 abs()函数的用法。
>> b=abs(k)
b =
77 121 32 32
110 97 109 101
105 115 32 32
26446 26576 26576 32
4.将字符串转换为相应的ASCII码
double(S
):此函数的作用与abs(S
)有相同之处,它是将符号矩阵或字符串转换为由双精度形式的浮点数组成的矩阵。在符号运算中,它是按双精度形式计算符号表达式的结果。
例2.28 double()函数的用法。
>> double('ab')
ans =
97 98
>> c=sym('1+2')
c =
3
>> double(c)
ans =
3
5.输出空格
blanks(n
)函数用于输出n
个空格。此函数在调整输出格式、输出多个空格时很有用,可以精确地输出需要的空格。它通常与disp()函数一起使用,对输出格式进行调整。
例2.29 blanks()函数的用法。
>> a=blanks(6);
>> size(a)
ans =
1 6
>> b=['10 spaces' blanks(10) 'end']
b =
10 spaces end
6.将字符串进行大小写转换
upper(s
)函数用于将字符串或字符串矩阵s
中的所有的小写字母转换成大写字母,原有的大写字母保持不变。
lower(s)函数用于将字符串或字符串矩阵s
中的所有的大写字母转换成小写字母,原有的小写字母保持不变。
例2.30 upper()函数和lower()函数的用法。
>> s=['hello';'WORLD'];
>> upper(s)
ans =
HELLO
WORLD
>> lower(s)
ans =
hello
world
7.将字符串作为命令执行
a=eval('字符串表达式'):此函数返回由字符串表达式执行的结果。可以将各个不同部分放在“[]”内以形成一整条命令。这个函数在M文件中进行交互式执行命令时很有用。
例2.31 利用eval()函数依次对a
1
~a
9
分别赋值1~9。
>> for i=1:9
eval(['a' char(abs('0')+i) '=' char(abs('0')+i)])
end
a1 =
1
a2 =
2
a3 =
3
a4 =
4
a5 =
5
a6 =
6
a7 =
7
a8 =
8
a9 =
9
2.5.3 字符串比较操作
字符串比较操作主要涉及对字符串按字母顺序进行比较以及对字符串进行匹配、查找、替换、提取子串等一系列的操作。这些是比较有用的操作,也可以归入调用命令部分,下面来详细讲解。
1.比较两个字符串
strcmp('string1', 'string2'):将两个字符串进行比较,如果两个字符串相等,此函数返回逻辑“真”,否则返回逻辑“假”,即此函数只能判断两个字符串是否相等,而不能判断按字母顺序谁在谁前面。
strcmp(C1
,C2
):如果C
1
和C
2
都是由字符串组成的大小相同的单元矩阵,则此函数返回一个与单元矩阵相同大小的逻辑矩阵。如果单元矩阵C
1
和C
2
相同位置上的字符串相同,则在逻辑矩阵的相应位置上输出1,否则输出0。C
1
和C
2
其中之一或二者全部都可以为字符串或字符串矩阵,但返回的逻辑矩阵与单元矩阵大小相同。
例2.32 利用strcmp()函数对两个字符串进行比较。
>> strcmp('hello','hello')
ans =
1
>> strcmp('hello','world')
ans =
0
>> c1={'my' 'name';'is' 'lilei'}
c1 =
'my' 'name'
'is' 'lilei'
>> c2={'her' 'name';'is' 'lili'}
c2 =
'her' 'name'
'is' 'lili'
>> c3='NAME'
c3 =
NAME
>> c4 = ['my' 'name';'is' 'lili']
c4 =
myname
islili
>> c5 = ['my' 'name';'is' 'lili']
c5 =
myname
islili
>> strcmp(c1,c2)
ans =
0 1
1 0
>> strcmp(c1,c3)
ans =
0 0
0 0
>> strcmp(c5,c4)
ans =
1
前导或后导空格也会参与比较,比较函数对大小写敏感。
2.比较字符串的前n个字符
strncmp('string1','string2',n
):如果两个字符串的前n
个字符相同,则此函数返回逻辑“真”,否则返回逻辑“假”,比较函数对大小写敏感。
strncmp(C1
,C2
,n
):如果C
1
和C
2
为由字符串组成的大小相同的单元矩阵,则此函数将相同位置的字符串的前n
个字符进行比较。如果相同就在相同位置输出1,否则输出0;如其中之一为字符串,则将单元矩阵中的所有字符串都与这个字符串进行比较,返回与单元矩阵大小相同的逻辑矩阵。
例2.33 利用strncmp()函数对两个字符串的前n
个字符进行比较。
>> s1='Matlab';s2='MatLab';
>> strncmp(s1,s2,3)
ans =
1
>> strncmp(s1,s2,4)
ans =
0
>> c1={'good' 'bad';'Matlab' 'Matlab'}
c1 =
'good' 'bad'
'Matlab' 'Matlab'
>> c2='MatLab'
c2 =
MatLab
>> strncmp(c1,c2,3)
ans =
0 0
1 1
>> strncmp(c1,c2,4)
ans =
0 0
0 0
3.匹配字符串操作
strmatch('substr',S
):S
可以是字符串矩阵或由字符串组成的单元矩阵,如果是单元矩阵,则必须是单列,函数返回以字符串substr开始的行的行号。字符串矩阵的查找速度要比单元矩阵的查找速度快。
例2.34 利用strmatch()函数对字符串进行匹配。
>> k=strmatch('good',strvcat('good','badgood','goodbad'))
k =
1
3
>> s={'yes';'noyes';'yesno'}
s =
'yes'
'noyes'
'yesno'
>> strmatch('yes',s,'exact')
ans =
1
4.在字符串中查找子串
findstr('str1','str2'):此函数在长字符串中查找短字符串,并返回长字符串中短字符串开始的所有位置。子串和母串在括号中都既可在前也可在后,即str1、str2中任意一个都可作为子串或母串。
例2.35 利用findstr()函数在字符串中查找子串。
>> s='This is a good goose.'
s =
This is a good goose.
>> b=findstr(s,'oo')
b =
12 17
5.字符串替换操作
strrep('str1','str2','str3'):此函数将字符串str1中的所有的字符串str2用字符串str3来代替。其中,str1、str2和str3任何一个都可以为字符串组成的单元矩阵或矩阵,返回的结果与此单元矩阵或矩阵大小相同。如果两个或两个以上为单元矩阵或矩阵时,则它们的类型和大小必须相同(每行的字符个数是不同的)。
例2.36 利用strrep()函数对字符串进行替换操作。
>> strrep(s,'oo','ee')
ans =
This is a geed geese.
>> str1={'matlab' 'welcome';'you' 'me'}
str1 =
'matlab' 'welcome'
'you' 'me'
>> str2={'MatLab' 'lab';'good' 'software'}
str2 =
'MatLab' 'lab'
'good' 'software'
>> str3={'mat' 'come';'you' 'me'}
str3 =
'mat' 'come'
'you' 'me'
>> strrep(str1,str3,str2)
ans =
'MatLablab' 'wellab'
'good' 'software'
>> strrep(str1,'me','you')
ans =
'matlab' 'welcoyou'
'you' 'you'
>> strrep('MatLab',str2,'!!!')
ans =
'!!!' 'MatLab'
'MatLab' 'MatLab'
>> strrep('matlab','lab',str3)
ans =
'matmat' 'matcome'
'matyou' 'matme'
6.得到指定的子串
strtok('string',d):此函数返回由字符d作为分隔符的字符串string的第1部分,也就是说,返回字符串string中第1个字符d之前的所有字符。如果字符串中不含有字符d,则返回整个字符串;如果d字符恰好为字符串string的第1个字符,则返回除第1个字符之外的所有字符。合法的d可以为任意字符或字符串,如果d为字符串,则将它的第1个字符作为分隔符。如果string中有前导空格,则前导空格将被忽略。
strtok('string'):此函数以默认的回车符(ASCII为13)、制表符(ASCII为9)、空格(ASCII为32)作为分隔符,前导空格将被忽略。
[token,rem]=strtok(…):此函数不单返回查找结果token,还返回剩余的字符串rem,其中不包括分隔符,前导空格被忽略。其中strtok(…)可以为strtok('string')或strtok('string',d)形式。
例2.37 利用strtok()函数得到指定的子串。
>> s='This is my good friend.'
s =
This is my good friend.
>> strtok(s,'is')
ans =
Th
>> strtok(s,'o')
ans =
This is my g
>> strtok(s,'T')
ans =
his is my good friend.
>> strtok(s,' ')
ans =
This
>> strtok(s)
ans =
This
>> [token,rem]=strtok(s,'m')
token =
This is
rem =
my good friend.
>> [token,rem]=strtok(s)
token =
This
rem =
is my good friend.
7.判断字符串中的元素是否为字母
isletter(s):s可以是字符串或字符串矩阵,此函数返回与s维数相同的逻辑矩阵,如果s中的元素为字母,则在逻辑矩阵的相应位置上输出1,否则输出0。
例2.38 利用isletter()函数判断字符串中的元素是否为字母。
>> isletter(s)
ans =
Columns 1 through 9
1 1 1 1 0 1 1 0 1
Columns 10 through 18
1 0 1 1 1 1 0 1 1
Columns 19 through 23
1 1 1 1 0
8.判断字符串中的元素是否为空格
isspace(s):此函数与isletter(s)函数用法相同,在为空格的逻辑矩阵的相应位置上输出1,否则输出0。
例2.39 利用isspace()函数判断字符串中的元素是否为空格。
>> isspace(s)
ans =
Columns 1 through 9
0 0 0 0 1 0 0 1 0
Columns 10 through 18
0 1 0 0 0 0 1 0 0
Columns 19 through 23
0 0 0 0 0
2.5.4 字符串与数值间的相互转换
MATLAB 主要是针对数据或矩阵运算的,因而在对字符串进行操作时必然会经常遇到字符串与数值之间相互转换的问题。将计算结果按照某种格式输出,或对图形对象进行标注和说明时就必须将数值转换为字符串。MATLAB提供了将数值转换为字符串和将字符串转换为数值这两种功能的函数。
1.将整数转换为字符串
int2str(A
):其中A
可以为数或矩阵,当然也包括复数。如果A
为数,则此函数将A
转换为字符串;如果A
为矩阵,则转换为字符串矩阵,每个数之间用空格隔开;如果A
为复数或复数矩阵,则只将其实部进行转换,即int2str(real(A
))。real(A
)为取矩阵A
的实部,如果A
中元素不为整数,则先取整,再进行转换。
例2.40 利用int2str()函数将整数转换为字符串。
>> A=[1.2 2.3 3.4;4.5 5.6 6.7]
A =
1.2000 2.3000 3.4000
4.5000 5.6000 6.7000
>> a=int2str(A)
a =
1 2 3
5 6 7
>> b=1234.5678;
>> int2str(b)
ans =
1235
>> c=7.2+8.9i;
>> int2str(c)
ans =
7
2.将浮点数转换为字符串
num2str():此函数将浮点数转换为字符串。这个函数在作图过程中用相应的计算结果对输出图形进行说明和标注时非常有用,可以用在M函数中,根据不同的图形对标注进行相应的更改。
num2str(A
):此函数将浮点数或数组A
转换为字符串或字符串矩阵,如果为复数,则其实部和虚部都不能忽略。
num2str(A
,N
):N
指定了转换的精度,即指定了字符串中每个数最多包含N
位数。
num2str(A
,format):此函数用指定的格式化字符串format转换数或矩阵A
。关于格式化输出,格式化字符串的表示方法与C语言相同。
例2.41 利用num2str()函数将浮点数转换为字符串。
>> A=[123.4566666 789.25444444;-1.485962222 0.0000578426];
>> a=num2str(A)
a =
123.4567 789.2544
-1.485962 5.78426e-005
>> B=[1.2345+1.2000i 2.54785+3.5000i;5.47854+6.2000i 9.12045+4.5000i];
>> b=num2str(B,3)
b =
1.23+1.2i 2.55+3.5i
5.48+6.2i 9.12+4.5i
>> A=[123.4566666 789.25444444;-1.485962222 0.0000578426];
>> a=num2str(A, '%10.3g')
a =
123 789
-1.49 5.78e-005
3.将字符串转换为浮点数
str2num(S
):S
可以为字符串或字符串矩阵,S
必须是合法的数据形式或表达式。如果S
为表达式,则此函数会给出计算所得的表达式的值,其功能与feval()函数相同。S
中合法的字符可以包括数字0~9,小数点“.”,正负号“+”“−”,表示10的乘方的“e”,表示复数虚部的“i”,以及各种数学符号,如*、/、sin、log等。
例2.42 利用str2num()函数将字符串转换为浮点数。
>> str2num(a)
ans =
123.0000 789.0000
-1.4900 0.0001
>> str2num('sin(1+2)')
ans =
0.1411
>> str2num('2*3;4/5-6')
ans =
6.0000
-5.2000
2.5.5 进制间的转换
数据在计算机中是以二进制数的形式存在的,而十六进制数在实际的表示中比二进制数要方便,因而除了十进制数之外,二进制数和十六进制数都是比较常用的两种数据。MATLAB提供了二进制数、十进制数、十六进制数和字符串之间转换的函数,这些函数在将数据以二进制数或十六进制数形式进行格式化输出时是非常有用的。
1.把十进制整数转换为十六进制字符串
dec2hex(A
):此函数将一个小于252的非负整数转换为十六进制字符串。
dec2hex(A
,n
):此函数将一个小于252的非负整数A
转换为n
位十六进制字符串。如果实际转换为的十六进制字符串的位数小于n
,则其余位上为0;如果实际转换为的十六进制字符串的位数大于n
,则忽略此限制。A
可以为由满足上述条件的整数组成的矩阵,返回结果为字符串矩阵。
例2.43 利用dec2hex()函数将十进制整数转换为十六进制字符串。
>> a=dec2hex(12345)
a =
3039
>> b=dec2hex(12345,10)
b =
0000003039
>> c=dec2hex(12345,1)
c =
3039
>> A=[12345,67];
>> d=dec2hex(A,1)
d =
3039
0043
2.把十六进制字符串转换为十进制整数
hex2dec(S
):此函数将字符串或字符串矩阵表示的十六进制数转换为相应的十进制整数。
例2.44 利用hex2dec()函数将十六进制字符串转换为十进制整数。
>> hex2dec(d)
ans =
12345
67
3.把十六进制字符串转换为浮点数
hex2num(S
):此函数将字符串表示的十六进制数转换为双精度浮点数。如果输入的字符串少于16个字符,函数会用0在其后面补足16个字符。S
可以为字符串矩阵。此函数也可以处理NaN和Inf等数。
例2.45 利用hex2num()函数将十六进制字符串转换为浮点数。
>> hex2num('e')
ans =
-2.6816e+154
>> hex2num('e0000000000000000')
ans =
-2.6816e+154
>> hex2num(['e03';'21b'])
ans =
1.0e+155 *
-2.1452
0.0000
>> hex2num('ffff')
ans =
NaN
>> hex2num('fff')
ans =
-Inf
4.把十进制数转换为二进制字符串
dec2bin(A
):此函数将十进制数或矩阵A
转换为其二进制字符串。A
本身或A
的元素(A
是矩阵时)都必须是小于252的非负整数。
dec2bin(A
,n
):此函数将十进制数或矩阵A
转换为由n
个字符组成的二进制字符串(A
对应的n
位二进制数)。如果实际转换为的二进制数的位数小于n
,则其余位上为0;如果实际转换为的二进制数的位数大于n
,则忽略此限制。
例2.46 利用dec2bin()函数将十进制数转换为二进制字符串。
>> A=[12 23;34 56];
>> dec2bin(A)
ans =
001100
100010
010111
111000
>> dec2bin(A,8)
ans =
00001100
00100010
00010111
00111000