自学内容网 自学内容网

matlab学习笔记:第五章5.3.2 字符向量元胞数组

1.cellstr函数:将其他类型的文本转换为字符向量元胞数组

%(1)cellstr函数:将其他类型的文本转换为字符向量元胞数组
a1 = ['abc',newline,char(9)]
cellstr(a1)        %{'abc'},字符向量(单引号引起来)cellstr函数会删除末尾的空格
a2 = char('  a','123','good')
cellstr(a2)        % a前面的空格不会被删除
a3 = ["abc", "def   "];
cellstr(a3)        %字符串(双引号引起来)cellstr函数不会自动删除空格
%例题:请将字符向量'1'、 '2'一直到'100'保存到元胞数组C中。(注意数字前面没有空格)
%方法一:
n = 100;
C = cell(1,n);
for i = 1:n
    C{i} = num2str(i)
end
%方法二:
c = [1:100]';
c_ = num2str(c)
C = (cellstr(strjust(c_,'left')))'
%方法三:
c = num2str((1:100)')
c_ = (cellstr(c))'
C = strip(c_)
%方法四:
C = cellstr(string(1:100))

2.isletter、isspace和isstrprop函数:识别特定种类的字符

isletter 函数用于判断字符是否为字母,它的使用方法非常简单:TF=isletter(A),输入参数A通常是字符数组或字符串标量(如果A是其他数据类型,那么isletter 函数会返回全为0的逻辑数组或者直接报错);返回值TF是一个逻辑数组,当A中的某个字符是字母时,TF中对应位置的元素是逻辑值1,否则是逻辑值0。(注意:isleter函数不仅会识别英文字母,还会识别其他语言中的文字,例如中文的汉字也会被识别为逻辑值1)

c1 = char('One is 1;','Ten is 10.')
isletter(c1)
c2 = 'Bonjour!'
isletter(c2)
c3 = '本周放假3天,真开心!'
isletter(c3)
c4 = {'One is 1','Two is 2'};
isletter(c4)
ind = cellfun(@isletter,c4,'UniformOutput',false)

isspace 函数和isletter函数用法类似,isspace函数用来判断字符是否是空白字符。例如,空格、制表符、换行符等。

c1 = ['春去 ',newline,'秋来 ',newline,'你还在。'] 
isspace(c1)
%能否找出所有被 isspace 函数识别为空白字符对应的 Unicode编码?
%在 Unicode 字符集中,十进制0到2^16-1(十六进制 0000-FFFF)涵盖了绝大多数常用字符,
%包括各种语言的文字、符号以及特殊字符,因此我们识别的字符范围可以限定在这个区间内.
S = { };
for i = 0:2^16-1
    c1 = isspace(char(i));
    if c1 == 1
        S = [S;i];
    end
end
S       %有25个

isstrprop 函数是前两个函数的进阶版本,它不仅能够识别字母和空白字符,还能识别更广泛的文本形式,如数字、标点符号、控制字符等。此外,isstrprop函数具备处理多种类型的文本数据的能力,包括字符数组、字符串标量、数值数组(其中的元素代表 Unicode 编码)字符向量元胞数组,以及字符串数组。isstrprop 函数的基本用法是 TF=isstrprop(str,category)。其中,第一个输入参数 str 表示文本数据, 第二个输入参数 category 是你想要检测的字符类别。它支持多种字符类别,例如'alpha'(字母)、'digit(数字)等。以下它是支持的字符类别的列表(来自MATLAB 官网): 

根据输入文本数据 str 的数据类型,isstrprop 函数返回不同类型的结果:如果str是字符数组、字符串标量或数值数组,则TF为逻辑数组类型:如果 str是字符向量元胞数组或字符串数组,则TF为元胞数组类型。此外,我们还可以在输入参数的最后加上'ForceCell0utput,true,这样可以强制返回值 TE为一个元胞数组,即使 str是一个字符数组、字符串标量或数值数组也是如此。

c1 = '10月1日是国庆节,今年放7天假。';
isstrprop(c1,'digit')   %数字
isstrprop(c1,'digit','ForceCellOutput',true)    %返回元胞数组
isstrprop(c1,'alphanum')%字母和数字
isstrprop(c1,'punct')   %标点符号
%提取C2中的电话号码
%方法一:
c2 = {'北京小王13288888888';
  '15877777777 小李上海';
  '小刘13199999999呼和浩特'};
TF = isstrprop(c2,'digit')
num = length(TF)
phone = cell(0)
for i = 1:num
    ind = TF{i};
    phone(i,1) = {c2{i}(ind)};
end
phone
%方法二:
f = @(x) x(isstrprop(x,'digit'));
x1 = cellfun(f, c2,'UniformOutput', false)
%方法三:
phoneNumberPattern = '\d{11}';  
x2 = regexp(c2, phoneNumberPattern, 'match')

3.strfind函数和strrep函数:查找与替换文本

c1 = '人要是行,干一行行一行'
strfind(c1,'行')
strfind(c1,'行','ForceCellOutput',true)

c2 = 'Are you a youngster?';
strfind(c2,'you')

c3 = {'How are you?';
'Are you a youngster?';
'You are so beautiful!'};
strfind(c3,'you')  % 结果区分大小写哦

c4 = '我18岁,手机号13123456789.';
strfind(c4,digitsPattern)  % 匹配所有数字
strfind(c4,digitsPattern(11))  % 匹配连续的11位数字

c1 = '你喜欢我,我也喜欢你!';
strrep(c1,'喜欢','不喜欢')
c2 = 'matlab很容易学!';
strrep(c2,'matlab','MATLAB')
c3 = {'abcdccd','efcacd','dcace'};
strrep(c3,'c','p')
c4 = '我和你,他和她。';
strrep(c4,{'他';'她'},'Ta')  % 分别将'他'和'她'替换为了'Ta'
strrep(c4,'和',{'与';'爱';'喜欢'})  % 将'和'分别替换为了'与'、'爱'和'喜欢'
strrep(c4,{'他';'她'},{'ta';'TA'})  % 将'他'和'她'分别替换为了'ta'和'TA'
cc = 'abababab';
strrep(cc,'aba','*')    %返回'***b',strrep函数允许重叠子文本,replace不允许
replace(cc,'aba','*')
c3 = {'abcdccd','efcacd','dcace'};
replace(c3,'c','p')
c4 = '我和你,他和她。';
replace(c4,{'他';'她'},'Ta')      %'他'、'她'同时被Ta替换
%replace(c4,'和',{'与';'爱';'喜欢'})  %会报错:替换文本必须为标量,或者与匹配文本具有相同的大小。
replace(c4,{'他';'她'},{'ta';'TA'})

4.strjoin函数:对数组中的文本进行连接

在使用 strjoin 函数时,分隔符可能包括一些在文本中不易直接表示的特殊字符,比如下述示例中的换行符。在 MATLAB中,为了便于使用换行符,提供了专用的newline 函数。此外,换行符的 ASCII编码是10,因此我们还可以通过 char(10)来表示换行符。对于其他一些不方便使用文本表示的字符,也可以使用对应的 ASCII 编码来表示。下面我们将介绍另一种表示特殊字符的方法:使用转义字符。什么是转义字符?转义字符在许多编程语言中都存在,它是一类特殊的字符,用于在文本中表示特定的字符,以下是 MATLAB 中常用的转义字符:

c1 = {'apple','banana','pear'};
strjoin(c1)  % 默认使用空格隔开
strjoin(c1,', ')  % 指定分隔符为', '
strjoin(c1,newline)  % 指定分隔符为换行符
c2 = {'one','three','four'};
strjoin(c2,{' + ',' = '})
strjoin(c2,'\n')
c3 = {'今天','明天','每一天'};
strjoin(c3,'\\')
strjoin(c3,'\n') % 换行符
c = '0\n0';
strjoin({'1','2'},c)
strjoin({'1','2'},'0\\n0')

5.strsplit函数:在指定分隔符处拆分文本

(1)CollapseDelimiters-多分隔符处理,指定为 true (默认值)或者 false多分隔符处理,指定为由'CollapseDelimiters'和 true/false 组成的名称-值参数。如果为true,则str中的连续分隔符将作为同一个分隔符处理。如果为false,则连续分隔符将作为单独的分隔符处理,这会导致匹配的分隔符之间出现空字符向量"(0x0char)元素。

(2)DelimiterType-分隔符类型,指定为'Simple'(默认)或者'RegularExpression分隔符类型这对参数的名称为'DelimiterType',它的值指定为下面两个字符向量之一:'Simple': strsplit 函数将 delimiter 当作普通文本处理;'RegularExpression':strsplit 函数将 delimiter 作为正则表达式处理。 

c1 = ['You are great! ', newline, 'I salute you.'];
strsplit(c1)        %默认是空格分隔
c2 = '  You are great!   ';
strtrim(c2)
strsplit(c2)
c3 = 'if,no,or,and';
strsplit(c3,',')    %用,分隔
c4 = 'if,no,,or,,,and';
strsplit(c4,',')
c5 = 'bacon, lettuce, and tomato';
strsplit(c5,{', ',', and '})    %先,再,and
strsplit(c5,{', and ',', '})    %先,and再,
% c6 = {'abc,def','ghi,jkl'};
% strsplit(c6,',')          %会报错:第一个输入必须为字符向量或字符串标量。
cc = 'if,no,,or,,,and';
strsplit(cc,',')
strsplit(cc,',','CollapseDelimiters',false)
% 高版本MATLAB可以这样写:
% strsplit(cc,',',CollapseDelimiters = false)

 


原文地址:https://blog.csdn.net/weixin_63883130/article/details/143835161

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!