Main Content

创建字符串数组

字符串数组可存储文本片段,并提供一组用于将文本按数据进行处理的函数。您可以对字符串数组进行索引、重构和进行串联,就像处理任何其他类型的数组一样。此外,还可以访问字符串中的字符,并使用 plus 运算符向字符串追加文本。要重新排列字符串数组中的字符串,请使用 splitjoinsort 等函数。

根据变量创建字符串数组

MATLAB® 提供字符串数组来存储文本片段。字符串数组的每个元素都包含一个 1×n 字符序列。

您可以使用双引号创建字符串。

str = "Hello, world"
str = 
"Hello, world"

作为备选方法,您可以使用 string 函数将字符向量转换为字符串。chr 为一个 1×17 字符向量。str 为一个与该字符向量具有相同文本的 1×1 字符串。

chr = 'Greetings, friend'
chr = 
'Greetings, friend'
str = string(chr)
str = 
"Greetings, friend"

使用 [] 运算符创建一个包含多个字符串的字符串数组。str 是一个 2×3 字符串数组,其中包含六个字符串。

str = ["Mercury","Gemini","Apollo";
       "Skylab","Skylab B","ISS"]
str = 2x3 string
    "Mercury"    "Gemini"      "Apollo"
    "Skylab"     "Skylab B"    "ISS"   

通过 strlength 函数计算 str 中的每个字符串的长度。使用 strlength 而非 length 来确定字符串中的字符数量。

L = strlength(str)
L = 2×3

     7     6     6
     6     8     3

作为备选方法,您可以使用 string 函数将字符向量元胞数组转换为字符串数组。MATLAB 使用双引号显示字符串数组中的字符串,使用单引号显示元胞数组中的字符向量。

C = {'Mercury','Venus','Earth'}
C = 1x3 cell
    {'Mercury'}    {'Venus'}    {'Earth'}

str = string(C)
str = 1x3 string
    "Mercury"    "Venus"    "Earth"

除了字符向量,您还可以使用 string 函数将数值、日期时间、持续时间和分类值转换为字符串。

将数值数组转换为字符串数组。

X = [5 10 20 3.1416];
string(X)
ans = 1x4 string
    "5"    "10"    "20"    "3.1416"

将日期时间值转换为字符串。

d = datetime('now');
string(d)
ans = 
"25-Jan-2024 22:12:28"

此外,您也可以使用 readtabletextscanfscanf 函数将文件中的文本读入字符串数组。

创建空字符串和缺失字符串

字符串数组可以包含空值和缺失值。空字符串不包含字符。当您显示空字符串时,结果为一对其间不包含任何内容的双引号 ("")。缺失字符串相当于数值数组的 NaN。它指示字符串数组包含缺失值的位置。当您显示缺失字符串时,结果为 <missing>,且不带任何引号。

使用 strings 函数创建一个空字符串数组。在不带任何参量的情况下调用 strings 时,将会返回一个空字符串。请注意,str 的大小是 1×1,而不是 0×0。但是,str 不包含字符。

str = strings
str = 
""

使用单引号创建一个空字符向量。请注意,chr 的大小是 0×0。

chr = ''
chr =

  0x0 empty char array

创建一个所有元素都是空字符串的字符串数组。您可以使用 strings 函数预分配一个字符串数组。

str = strings(2,3)
str = 2x3 string
    ""    ""    ""
    ""    ""    ""

要创建缺失字符串,请使用 string 函数转换缺失值。缺失字符串显示为 <missing>

str = string(missing)
str = 
<missing>

您可以创建同时包含空字符串和缺失字符串的字符串数组。使用 ismissing 函数确定哪些元素为包含缺失值的字符串。请注意,空字符串不是缺失字符串。

str(1) = "";
str(2) = "Gemini";
str(3) = string(missing)
str = 1x3 string
    ""    "Gemini"    <missing>

ismissing(str)
ans = 1x3 logical array

   0   0   1

将一个缺失字符串与另一个字符串进行比较。结果始终为 0 (false),即使您将一个缺失字符串与另一个缺失字符串进行比较也是如此。

str = string(missing);
str == "Gemini"
ans = logical
   0

str == string(missing)
ans = logical
   0

访问字符串数组的元素

字符串数组支持数组运算,例如进行索引和重构。使用数组索引访问 str 的第一行以及所有列。

str = ["Mercury","Gemini","Apollo";
       "Skylab","Skylab B","ISS"];
str(1,:)
ans = 1x3 string
    "Mercury"    "Gemini"    "Apollo"

访问 str 的第二行中的第二个元素。

str(2,2)
ans = 
"Skylab B"

str 的边界之外分配一个新字符串。MATLAB 将扩展该数组并使用缺失值填充未分配的元素。

str(3,4) = "Mir"
str = 3x4 string
    "Mercury"    "Gemini"      "Apollo"     <missing>
    "Skylab"     "Skylab B"    "ISS"        <missing>
    <missing>    <missing>     <missing>    "Mir"    

访问字符串中的字符

您可以使用花括号 {} 对字符串数组进行索引以直接访问字符。当您需要访问和修改字符串元素中的字符时,请使用花括号。通过花括号进行索引为可处理字符串数组或字符向量元胞数组的代码提供了兼容性。但是只要有可能,请尽量使用字符串函数来处理字符串中的字符。

使用花括号访问第二行中的第二个元素。chr 是一个字符向量,而不是字符串。

str = ["Mercury","Gemini","Apollo";
       "Skylab","Skylab B","ISS"];
chr = str{2,2}
chr = 
'Skylab B'

访问该字符向量并返回前三个字符。

str{2,2}(1:3)
ans = 
'Sky'

查找字符串中的空格字符,并将这些字符替换为短划线。使用 isspace 函数检查字符串中的单个字符。isspace 会返回一个逻辑向量,只要存在一个空格字符,该向量即包含一个 true 值。最后,显示修改后的字符串元素 str(2,2)

TF = isspace(str{2,2})
TF = 1x8 logical array

   0   0   0   0   0   0   1   0

str{2,2}(TF) = "-";
str(2,2)
ans = 
"Skylab-B"

请注意,在该示例中,您也可以使用 replace 函数来替换空格,而无需借助于花括号索引。

replace(str(2,2)," ","-")
ans = 
"Skylab-B"

将字符串串联到字符串数组中

将字符串串联到字符串数组中,就像您串联任何其他类型的数组一样。

使用方括号 [] 串联两个字符串数组。

str1 = ["Mercury","Gemini","Apollo"];
str2 = ["Skylab","Skylab B","ISS"];
str = [str1 str2]
str = 1x6 string
    "Mercury"    "Gemini"    "Apollo"    "Skylab"    "Skylab B"    "ISS"

转置 str1str2。将它们进行串联,然后将列标题垂直串联到字符串数组上。当您将字符向量串联到字符串数组中时,字符向量会自动转换为字符串。

str1 = str1';
str2 = str2';
str = [str1 str2];
str = [["Mission:","Station:"] ; str]
str = 4x2 string
    "Mission:"    "Station:"
    "Mercury"     "Skylab"  
    "Gemini"      "Skylab B"
    "Apollo"      "ISS"     

向字符串追加文本

要向字符串追加文本,请使用 plus 运算符 +plus 运算符可向字符串追加文本,但不会更改字符串数组的大小。

在名字数组中追加一个姓氏。如果您将某个字符向量追加到字符串,则该字符向量将自动转换为字符串。

names = ["Mary";"John";"Elizabeth";"Paul";"Ann"];
names = names + ' Smith'
names = 5x1 string
    "Mary Smith"
    "John Smith"
    "Elizabeth Smith"
    "Paul Smith"
    "Ann Smith"

追加不同的姓氏。您可以将文本从一个字符串数组或字符向量元胞数组追加到另一个字符串数组。当您添加非标量数组时,这些数组的大小必须相同。

names = ["Mary";"John";"Elizabeth";"Paul";"Ann"];
lastnames = ["Jones";"Adams";"Young";"Burns";"Spencer"];
names = names + " " + lastnames
names = 5x1 string
    "Mary Jones"
    "John Adams"
    "Elizabeth Young"
    "Paul Burns"
    "Ann Spencer"

追加缺失字符串。当您使用加号运算符追加缺失字符串时,输出为一个缺失字符串。

str1 = "Jones";
str2 = string(missing);
str1 + str2
ans = 
<missing>

拆分、联接和排序字符串数组

MATLAB 提供了一组丰富的函数来处理字符串数组。例如,您可以使用 splitjoinsort 函数重新排列字符串数组 names,以使名字按姓氏的字母顺序排列。

按空格字符拆分 names。拆分会将 names 从 5×1 字符串数组更改为 5×2 数组。

names = ["Mary Jones";"John Adams";"Elizabeth Young";"Paul Burns";"Ann Spencer"];
names = split(names)
names = 5x2 string
    "Mary"         "Jones"  
    "John"         "Adams"  
    "Elizabeth"    "Young"  
    "Paul"         "Burns"  
    "Ann"          "Spencer"

names 的列交换位置,使姓在第一列。在每个姓后面添加一个逗号。

names = [names(:,2) names(:,1)];
names(:,1) = names(:,1) + ','
names = 5x2 string
    "Jones,"      "Mary"     
    "Adams,"      "John"     
    "Young,"      "Elizabeth"
    "Burns,"      "Paul"     
    "Spencer,"    "Ann"      

将姓和名联接起来。join 函数在它联接的字符串之间放置一个空格字符。进行联接之后,names 为一个 5×1 字符串数组。

names = join(names)
names = 5x1 string
    "Jones, Mary"
    "Adams, John"
    "Young, Elizabeth"
    "Burns, Paul"
    "Spencer, Ann"

names 的元素进行排序,使它们按字母顺序排列。

names = sort(names)
names = 5x1 string
    "Adams, John"
    "Burns, Paul"
    "Jones, Mary"
    "Spencer, Ann"
    "Young, Elizabeth"

另请参阅

| | | | | | | |

相关主题