首页 > 编程笔记 > MATLAB笔记

MATLAB处理字符串的多个函数(附带实例)

MATLAB 中提供了大量的字符串处理函数,如下表所示。

表 1 MATLAB 字符串处理函数
处理函数 功能 处理函数 功能
eval(str) 作为一个 MATLAB 命令求字符串的值 isspace(A) 空格字符存在时返回真值
blanks(n) 返回一个具有 n 个空格的字符串 isstring(A) 输入为字符串数组,返回真值
deblank(str) 去掉字符串末尾的空格 ischar(A) 输入为字符数组,返回真值
feval 求由字符串给定的函数值,后面讲解 strcmp(s1,s2) 字符串相同,返回真值
strfind(str,pat) 从一个字符串内找出字符串 strrep (str,old,new) 用一个字符串替换另一个字符串
isletter(A) 字母存在时返回真值 strtok(str) 在一个字符串中找出第一个标记

MATLAB字符串或字符串数组的构造

字符串或字符串数组的构造可以通过直接给变量赋值来实现,具体表达式中字符串的内容需要写在单引号内。如果字符串的内容包含单引号,那么以两个重复的单引号来表示。

在构造多行字符串时,若字符串的内容写在[]内,则多行字符串的长度必须相同;若字符串的内容写在{ }内,则多行字符串的长度可以不同。

【实例】直接赋值构造字符串示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
Str_a='How are you?'      % 定义字符串变量
Str_a =
    'How are you?'

Str_b='I don''t know.'   % 定义字符串变量
Str_b =
    'I don''t know.'

Str_c = strcat(Str_a, Str_b)  % 将 Str_a 和 Str_b 连接起来
Str_c =
    'How are you?I don''t know.'

继续在命令行窗口中输入:
Str_mat = ['July';'August';'September'];  % 在 [] 内,多行字符串的长度必须相同
错误使用 vertcat
要串联的数组的维度不一致。

继续在命令行窗口中输入:
Str_mat1 = ['U r a man.'; 'I'm a pen.'],  % 在 [] 内,多行字符串的长度必须相同
Str_mat1 =
    2×10 char 数组
    'U r a man.'
    'I'm a pen.'

Str_mat2 = {'July';'August';'September';}  % 在 {} 内,多行字符串的长度可以不同
Str_mat2 =
    3×1 cell 数组
    {'July'    }
    {'August'  }
    {'September'}

MATLAB 中还提供了 strvcat() 和 char() 函数用于纵向连接多个字符串。在使用 strvcat() 函数连接多行字符串时,每行字符串的长度不要求相同,所有非最长字符串的右边会自动补偿空格,使得每行字符串的长度相同。

char() 函数与 strvcat() 函数类似,不过当多行字符串中有空字符串时,strvcat() 函数会自动忽略,而 char() 函数则会把空字符串也用空格补偿后连接。

【实例】构造字符串示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
A='top';        % 定义字符串变量 A 为 'top'
B='';           % 定义字符串变量 B 为空字符串
C='Bottom';     % 定义字符串变量 C 为 'Bottom'

sABC=strvcat(A,B,C)  % 按行将 A、B、C 连接成一个字符数组,空字符串会被忽略
sABC =
    2×6 char 数组
    'top   '
    'Bottom'

cABC=char(A,B,C)    % 按行将 A、B、C 连接成一个字符数组,空字符串被转换为一个空行
cABC =
    3×6 char 数组
    'top   '
    '      '
    'Bottom'

size=[size(sABC); size(cABC)]  % 计算 sABC 和 cABC 的大小,结果以矩阵形式存储
size =
    2     6
    3     6

MATLAB字符串比较

两个字符串之间的关系可以通过关系运算符来比较,也可以使用 strcmp() 函数来比较两个字符串是否相同。

【实例】比较字符串示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
A = (' Hello ' == ' Word ')  % 尝试比较两个字符串
对于此运算,数组的大小不兼容。

继续在命令行窗口中输入:
A = (' Hello ' == ' World ')  % 比较两个字符串
A =
    1×7 logical 数组
    1     0     0     0     1     0     1

B = (' Hello ' == ' Hello '),  % 比较两个相同的字符串
B =
    1×7 logical 数组
    1     1     1     1     1     1     1

C = strcmp(' Hello ', ' World ')  % 字符串比较,返回逻辑值
C =
    logical
    0

D = strcmp(' Hello ', ' Hello ')  % 字符串比较,返回逻辑值
D =
    logical
    1
在使用关系运算符进行比较时,会对字符串的每个字符进行比较,返回值是一个与字符串长度相同的数组,因此被比较的两个字符串的长度必须相同;而 strcmp() 函数则根据两个字符串相同与否,返回值为数值 0 或 1。

MATLAB字符串查找和替换

字符串的查找与搜索可以通过 findstr() 函数来实现。

【实例】按下标值查找字符串示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
String = 'Peter Piper picked a peck of pickled peppers.';  % 定义字符串变量
findstr(String,' ')  % 搜索字符串内的空格位置
ans =
    6    12    19    21    26    29    37    46

findstr(String,'p')  % 搜索字母 p
ans =
    9    13    22    30    38    40    41

findstr(String,'cow')  % 搜索单词 cow
ans =
    []

findstr(String,'pick')  % 搜索单词 pick
ans =
    13    30
findstr() 函数对字母的大小写是敏感的。另外,findstr() 函数对字符串矩阵不起作用,因此,对字符串矩阵的搜索只能通过循环索引矩阵内的元素实现。

字符串的替换可以通过对字符串数组中相应的元素进行直接赋值来实现,也可以使用 strrep() 函数来实现。

【实例】替换字符串示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
String = ' Peter Piper picked a peck of pickled peppers. ';
String(1:12) = ' Helen Smith '
String =
    ' Helen Smith picked a peck of pickled peppers. '

String = strrep(String, ' Helen Smith', ' Sabrina Crame')
String =
    ' Sabrina Crame picked a peck of pickled peppers. '
直接赋值方法并不能使两个不同长度的字符串相互替换,而使用 strrep() 函数则可以替换两个任意长度的字符串。与 findstr() 函数类似,strrep() 函数也对字符串矩阵不起作用。

MATLAB字符串和数值的转换

MATLAB 中还提供了大量字符型与数值型的转换函数,如下表所示。

表 2 字符型与数值型的转换函数
函数名称 函数功能 函数名称 函数功能
dec2hex(D) 十进制数转换成十六进制字符串 abs(X) 字符转换成 ASCII 码
num2str(A) 数字转换成字符串 char(A1,A2,...) 字符串转换成一个字符数组
hex2dec(hexStr) 十六进制字符串转换成十进制数 fprintf 把格式化的文本写到文件中或屏幕上
hex2num(hexStr) 十六进制字符串转换成 IEEE 浮点数 sprintf 用格式控制数字转换成字符串
int2str(N) 整数转换成字符串 sscanf 用格式控制字符串转换成数字
str2num(str) 字符串转换成数字 lower(str) 字符串转换成小写形式
str2double(str) 将字符串转换为双精度浮点数 upper(str) 字符串转换成大写形式

【实例】将数值嵌入字符串中示例。在命令行窗口中输入以下语句,并显示相应的输出结果。
rad = 2.5;
area = pi * rad ^ 2;
string = [' A circle of radius ' num2str(rad) ' has an area of ' ...
          num2str(area) ' . ' ];
disp(string)
A circle of radius 2.5 has an area of 19.6355.

推荐阅读