MATLAB在处理数据时,经常需要对字符串进行操作,下面总结了一些常用的字符串操作,大家可以补充。
一、创建字符串
%该代码用于创建和合并字符串,创建二维字符数组和合并二维字符数组
%主要涉及的函数有strcat(),char(),strvcat()
clear,clc
%[1]用一对单引号来表示字符串
str1='My name is NAME';
str2='I am a great person!';
%[2]用字符串合并函数strcat()合并字符串str1和str2。注:该函数会把str1尾部空格删除
str=strcat(str1,str2);
%解决办法,在中间插入空格字符
string1=strcat(str1,32,str2); %32是指空格的ASCLL码
string2=strcat(str1,',',str2);
%或者用[]来实现字符串合并
string3=[str1 str2]
length(str1),length(str2)
length(string1),length(string2),length(string3)%相等
%【3】也可以构造二维字符数组,不过每一行必须保证有相同的长度
array1=['string';'abcdef'];
%或者自行用空格补齐
array2=['name ';'string'];
%【4】用char()函数或者strvcat()函数来创建二维字符数组,该函数在创建字符数组时,若各行长度不同,
%则自动用空格补齐到最大长度
array3=char('abc','abcd')
array4=strvcat('abc','abcd')
二、字符串比较
%该代码用于比较两个字符串是否相等,包括比较字符子串
%主要涉及的函数有strcmp(),strncmp().strcmpi(),strncmpi()
clear,clc
%% 【1】strcmp(),strncmp(),strcmpi(),strncmpi()
%strcmp(S1,S2),比较两个字符串是否相等,相等返回1,否则返回0
%strncmp(S1,S2,N),比较两个字符串的前N个字符是否相等,相等返回1,否则返回0
%strcmpi(S1,S2),比较两个字符串是否相等(忽略大小写),相等返回1,否则返回0
%strncmpi(S1,S2),比较两个字符串的前N个字符是否相等(忽略大小写),相等返回1,否则返回0
str1='blink';
str2='blank';
str3='BLANK';
is_equal=strcmp(str1,str2);
is_equal_n=strncmp(str1,str2,2);
is_equal_i=strcmpi(str2,str3);
is_equal_n_i=strncmpi(str1,str3,2);
%% 【2】用关系运算符比较字符串(>,>=,<,<=,==,!=)
%可用关系运算符比较字符串,但要求字符数组有相同的维数,或者其中有一个是标量
c=str1==str2;
三、字符串数组和单元字符串数组之间的转换
%该代码用于字符串数组和单元字符串数组之间的转换
%主要涉及的函数有cellstr(),char()
clear,clc
array1=['str ';'abcdef'];
%【1】用cellstr()函数将一个二维字符串数组转换成字符串单元数组
cellArray=cellstr(array1);%注意:cellstr()已经把字符串尾部的空格去掉
%【2】可以用char()函数把一个字符串单元数组转换成一个字符数组
charArray=char(cellArray)
length(charArray(1,:))
以下是R语言的字符串操作
用R来处理字符串数据并不是一个很好的选择,还是推荐使用Perl或者Python等语言。不过R本身也提供了一些常用的字符串处理函数,这篇文章就对这些字符串函数做一个简单的总结,具体各个函数的使用方法还是要参考R的帮助文档。
取子字符串
substr(x,start,stop)
substring(text, first, last=1000000 )
x为字符串向量。两个函数的不同之处在于函数substr()必须指定子字符串的起始位置和结束位置;而substring()可以不用指定结束位置,默认为1000000,如果字符串的长度小于1000000,则默认为取到字符串的结尾处。
> substr("sinablog",2,4)
[1] "ina"
> substring("sinablog",2,4)
[1] "ina"
> substring("sinablog",5)
[1] "blog"
> substr("sinablog",5,10)
[1] "blog"
另一个例子,此时x是一个含有多个元素的字符串向量:
> x <- c("asfef", "qwerty", "yuiop[", "b", "stuff.blah.yech")
> substring(x, 2, 5)
[1] "sfef" "wert" "uiop" "" "tuff"
字符串替换
substr(x,start,stop)<-value
substring(text, first, last = 1000000)<-value
同样的,substr必须指定开始处,结尾处,而substring结尾处默认为1000000,基本大于大多数的字符串长度,可以不用指定。
> x <- c("asfef", "qwerty", "yuiop[", "b", "stuff.blah.yech")
> substring(x, 2) <- c("..", "+++","test","test","test")
> x
[1] "a..ef" "q+++ty" "ytest[" "b" "stest.blah.yech"
> substr(x, 2,4) <- c("..", "+++","test","test","test")
> x
[1] "a..ef" "q+++ty" "ytest[" "b" "stest.blah.yech"
字符串拆分
strsplit(x, split, extended = TRUE, fixed = FALSE, perl = FALSE)
其中x为待拆分的字符串向量,split拆分模式(可以使用正则表达式);fixed为TRUE表示精确匹配,否则表示可以使用正则表达式;perl为TRUE表示要是用Perl兼容正则表达式;由于可以使用正则表达式,所以一些特殊字符有特殊的含义,在使用的时候要注意对特殊字符的转义。
> strsplit("a.b.c", ".")
[[1]]
[1] "" "" "" "" ""
这是因为在正则表达式中,点“.”是通配符,表示任意的单个字符。而要想得到普通意义上的结果,要使用两个反斜杠"\\"对通配符“.”进行转义(这是windows下的试验,由于手边没有linux服务器,没有测试linux下是使用一个反斜杠还是两个,猜测是一个即可)或者使用精确匹配(即限定参数fixed=TRUE)来实现。
另外需要说明一点的是:直接使用split函数得到的结果是一个列表,如果希望得到一个向量,可以使用
unlist函数。
> unlist(strsplit("a.b.c", "\\."))
[1] "a" "b" "c"
> unlist(strsplit("a.b.c", ".",fixed=TRUE))
[1] "a" "b" "c"
若希望得到各个字母组成的字符串向量:
unlist(strsplit("abc",""))
[1] "a" "b" "c"
字符串连接
paste(..., sep = " ", collapse = NULL)
其中sep表示不同的字符串之间的分隔符,默认为空格。
> paste("a","b","c",sep=".")
[1] "a.b.c"
> paste("A", 1:6)
[1] "A 1" "A 2" "A 3" "A 4" "A 5" "A 6"
获取字符串的长度
nchar(x, type = "chars", allowNA = FALSE)
其中type表示测量单位,有三个选择:chars,bytes,width。
nzchar(x)用于判断一个变量的长度是否为0。
需要注意的是,对于缺失值NA,nzchar()的结果为TRUE,而函数nchar()的返回结果为2。所以在对字符串进行测量之前,最好先使用is.na()函数判断一下是否是NA值。
> x<-"sinablog"
> nchar(x)
[1] 8
> nzchar(x)
[1] TRUE
> x<-NA
> is.na(x)
[1] TRUE
> nchar(x)
[1] 2
> nzchar(x)
[1] TRUE
从左端起取字符串的特定长度子串
strtrim(x,width)
width为要取的长度,如果width的值大于字符串x的长度,则默认取到x的结尾。
> strtrim(c("abcdef", "abcdef", "abcdef"), c(1,5,10))
[1] "a" "abcde" "abcdef"
在上面提到了正则表达式,这是一个处理文本数据的强大工具,但是还是老话,R的优势并不在这里,还是推荐使用Perl或者Python等其它语言(特别是Perl)。不过,R也同样提供了一些函数可以使用正则表达式,具体的讨论就放到下一篇博文里吧!