5.3 字符操作类函数
5.3.1 创建空格:blanks
S=blanks(n)
创建一定数量(n)的空格。
例如:
>> disp(['xx' blanks(5) 'yy'])↙
xx yy
5.3.2 格式化为字符:sprintf
(1)str = sprintf(format, A, ...)
(2)[str, errmsg] = sprintf(format, A, ...)
根据格式化符format,将A格式化为字符内容存储于变量str中,如果格式化操作不成功,变量errmsg中存储错误信息,否则errmsg为空。
格式化符为以%开始的字符串,针对不同的字符具有不同的含义,格式如下:
%(标志符)(宽度)(小数位数)转义符
常用转义符有:
(1)有符号整数:%d、%i表示十进制;%ld、%li表示64位十进制,%hd、%hi表示16位十进制;
(2)无符号整数:%u表示十进制;%o表示八进制;%x表示十六进制(使用小写a-f);%X表示十六进制(使用大写A-F);
(3)浮点数:%f表示浮点数;%e表示指数形式(科学计数法),小写e,如3.14e+03;%E科学计数法,大写E;
(4)字符:%c表示单个字母;%s表示字符串。
常用标志符有:
(1)0:在数字前加上前导0(用0补齐位数);
(2)−:左对齐。
宽度和小数位数均用数字表示。
除此之外,常用的控制符还包括:\n:新行;\r:回车符;\t:制表符。
例如:
>> sprintf('%f',45)↙
ans = 45.000000
>> sprintf('%10.2f',45)↙
ans = 45.00
>> sprintf('%010.2f',45)↙
ans = 0000045.00
>> sprintf('%x',45)↙
ans = 2d
>> sprintf('%s--%s%c','It''s','Matlab','!')↙
ans = It's--Matlab!
5.3.3 转换为大/小写:upper/lower
(1)B = upper(A)
(2)B = lower(A)
将字符A转换成大写或小写。
例如:
>> b=upper('hello matlab!')↙
b = HELLO MATLAB!
>> lower(b)↙
ans = hello matlab!
5.3.4 去除首尾空格:strtrim
(1)S = strtrim(str)
(2)C = strtrim(cstr)
去除字符串(str)首尾或字符单元数组(cstr)的空格,并将结果存储于返回值中。
例如:
>> strtrim(' Hello Matlab! ')↙
ans = Hello Matlab!
>> str={' Matlab is powerful ', ' Hello Matlab '};↙ >> strtrim(str)↙
ans = 'Matlab is powerful' 'Hello Matlab'
参见例5.1。
5.3.5 去除尾部空格:deblank
(1)str = deblank(str)
(2)c = deblank(c)
去除字符串(str)尾部空格,如果处理对象是字符型单元数组(c),则针对每个元素处理。
例如:
>> a='xx';b='yy';c=deblank(' Hello Matlab! ');↙ >> [a c b]↙
ans = xx Hello Matlab!yy
5.3.6 字符替换:strrep
modifiedStr = strrep(origStr, oldSubstr, newSubstr)
将字符串 origstr 中所有的 oldSubstr 字符串替换为新字符串 newSubstr,替换完毕后的结果存入modifiedStr字符变量中。
例如:
>> str='This is my computer.';↙ >> str=strrep(str,'my','your')↙
str = This is your computer.
参见Replace(8.4.13小节)。
5.3.7 字符查找:findstr/strfind
(1)k = findstr(str1, str2)
(2)k = strfind(str1, str2)
在字符串str1中查找字符内容str2,返回字符内容str2在字符串str1中的位置,如果未找到则返回空值,findstr函数在未来版本中将去除。
例如:
>> strfind('Hello matlab, I like matlab!','matlab')↙
ans = 7 22
>> findstr('Hello matlab, I like matlab!','Matlab')↙
ans = []
5.3.8 格式化读取:sscanf/strread
(1)A = sscanf(str, format)
(2)A = sscanf(str, format, sizeA)
(3)[A, count] = sscanf(...)
(4)[A, count, errmsg] = sscanf(...)
(5)[A, count, errmsg, nextindex] = sscanf(...)
对于函数sscanf而言,从字符变量str中,根据格式化字串format中的定义(参见5.3.2小节),读取格式化内容,并将结果赋值给矩阵A,其中count变量存储成功读取的元素数,errmsg存储错误发生时的错误信息,nextindex中存储扫描的字符数加1。
例如:
>> [a c err index]=sscanf('45 36 dd 77','%d')↙
a = 45 36 c = 2 err = Matching failure in format. index = 7
>> [str, count] = sscanf('one two three', '%c')↙
str = one two three count = 13
>> [str, count] = sscanf('one two three', '%s')↙
str = onetwothree count = 3
>> tempString = '78°F 72°F 64°F 66°F 49°F';↙ >> degrees = char(176);↙ >> tempNumeric = sscanf(tempString, ['%d' degrees 'F'])'↙
tempNumeric = 78 72 64 66 49 A = strread('str') [A, B, ...] = strread('str') [A, B, ...] = strread('str', 'format') [A, B, ...] = strread('str', 'format', N) [A, B, ...] = strread('str', 'format', N, param, value, ...)
对于函数strread而言,从字符串str中根据格式化定义符format读取格式化数值(格式化定义符参见5.3.2小节,除此之外,strread函数中还可以使用,%[…]限定读取[ ]内指定的内容,%[^…]限定读取[ ]之外的内容,%*…来忽略*之后的内容,具体应用参见例如)。注意:对于第一种形式,字符串str中不能含有文本内容,必须是数值内容。可以通过参数N指定读取次数,或者通过参数param和value来自定义,常用param和对应value如表5-1所示。
表5-1 strread函数可用参数及含义
例如:
>> str = '<table border=5 width="100%" cellspacing=0>';↙ >> [border width space] = strread(str, '%*s%*s %c %*s "%4s" %*s %c', 'delimiter','= ')↙
border = 5 width = '100%' space = 0
>> whos↙
Name Size Bytes Class Attributes border 1x1 2 char space 1x1 2 char str 1x43 86 char width 1x1 68 cell
上例中字符内容与格式化符的对应关系为:
<table border = 5 width = "100%" cellspacing = 0 > %*s %*s %c %*s "%4s" %*s %c
>> strread('47 36 55')↙
ans = 47 36 55
>> [a b c]=strread(sprintf('47 36 55 67\n'),'%d%d%d','emptyvalue',NaN)↙
a = 47 67 b = 36 NaN c = 55 NaN
>> strread('47|36|55|67|','%d','delimiter','|')↙
ans = 47 36 55 67
>> str = 'Section 4, Page 7, Line 26';↙ >> [name value] = strread(str, '%s %d,')↙
name = 'Section' 'Page' 'Line' value = 4 7 26
>> str = 'Answer_1: T, Answer_2: F, Answer_3: F';↙ >> [a b] = strread(str, '%s %[TF]', 'delimiter', ', ')↙
a = 'Answer_1:' 'Answer_2:'
'Answer_3:' b = 'T' 'F' 'F'
5.3.9 执行字符表达式:eval
(1)eval(expression)
(2)[a1, a2, a3, ...] = eval('myfun(b1, b2, b3, ...)')
MATLAB提供了执行字符化的表达式的简便方法,如将3*4+5数学表达式置于引号内作为一个字符串,使用eval函数即可以对其进行运算。
例如:
>> eval('3*4+5')↙
ans = 17
>> eval('surf(rand(5))')↙
结果绘制如图5-1所示的图形。
图5-1 eval('surf(rand(5))')显示结果
>> eval('plot(0:0.1:2*pi,sin(0:0.1:2*pi))')↙
结果绘制如图5-2所示的图形。
图5-2 利用eval函数绘制的正弦曲线
参见9.14.3小节。
5.3.10 子串提取:strtok
(1)token = strtok(str)
(2)token = strtok(str, delimiter)
(3)[token, remain] = strtok('str', ...)
从左至右析分字符串 str,可以指定分界符(delimiter),如空格(默认值)、制表符或回车等,析分出的子串存于变量token中,剩余的部分存于变量remain中,函数会略过分界符,如果未提取出任何内容,则为空字符串。
例如:
>> [token, remain] = strtok(s)↙
token = This remain = is a simple example.
下面为代码片段
s = sprintf('%s%s%s%s', ... '<ul class=continued><li class=continued>', ... '<pre><a name="13474"></a>token = strtok', ... '(''str'', delimiter)<a name="13475"></a>', ... 'token = strtok(''str'')'); remain = s; while true [str, remain] = strtok(remain, '<>'); if isempty(str), break; end disp(sprintf('%s', str)) end
输出结果为:
ul class=continued li class=continued pre a name="13474" /a token = strtok('str', delimiter) a name="13475" /a token = strtok('str')
5.3.11 字符比较:strcmp/strcmpi/strncmp/strncmpi
(1)TF = strcmp('str1', 'str2')
(2)TF = strcmpi('str1', 'str2')
(3)TF = strncmp('str1', 'str2', n)
(4)TF = strncmpi('str1', 'str2', n)
判断字符串str1与字符串str2是否相等,如果相等,则返回值为真(1),否则返回值为假(0)。末尾带i的函数为忽略大小写,即'a'='A'。另外函数strncmp与strncmpi可以通过参数n指定要比较的前多少个字符,即如果前n个字符相等,则判断为相等。
例如:
>> strncmp('Matlab + PsychToolbox','matlab',6)↙
ans = 0
>> strncmpi('Matlab + PsychToolbox','matlab',6)↙
ans = 1
>> list = {'calendar' 'case' 'camdolly' 'circshift' ...↙
'caxis' 'camtarget' 'cast' 'camorbit' ...↙ 'callib' 'cart2sph'};↙ >> strncmp(list,'cam',3) ans = 0 0 1 0 0 1 0 1 0 0
>> list{strncmp(list, 'cam', 3)}↙
ans = camdolly ans = camtarget ans = camorbit
参见streq(8.4.12小节),例5.1。
5.3.12 字符拼接:strcat/strvcat
(1)S = strcat(s1, s2, ..., sN)
(2)S = strvcat(s1,s2, s3, ...)
将字符串s1,s2,s3等水平或垂直拼接,它们还可以拼接字符型单元数组。
例如:
>> a = {'abcde', 'fghi'};↙ >> b = {'jkl', 'mn'};↙ >> ab = strcat(a, b)↙
ab = 'abcdejkl' 'fghimn'
>> t1 = 'first'; t2 = 'string'; t3 = 'matrix'; t4 = 'second';↙ >> str1=strcat(t1,t2,t3)↙
str1 = firststringmatrix
>> str2=strvcat(t1,t2,t3,t4)↙
str2 = first string matrix second
>> whos str1 str2↙
Name Size Bytes Class Attributes str1 1x17 34 char str2 4x6 48 char