第5章:5.4.4 字符串数组的配套函数 (MATLAB入门课程)

​讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili

MATLAB自2016b版本正式引入字符串类型起,其文本处理能力就得到了进一步提升。为了增强字符串数组的操控性和便利性,MATLAB提供了一系列与之配套的文本处理函数。在本章前面的小节中,我们已经介绍了其中的一些函数。

以下是这些函数的总结,以及它们在本章中的具体位置:

这些函数不仅方便了字符串的操作,也极大地提升了文本处理的效率。

接下来,我们将深入探讨其他一些实用且高效的字符串处理函数(注意:许多函数也同时支持其他文本类型的处理),这些函数全部在MATLAB2016b版本中被推出。根据它们的功能,我们可划分为六大板块,下面先给出相应的表格:


5.4.4.1    板块一:调整功能

在处理字符串数据时,我们常常需要调整字符串的格式和布局以满足特定的需求。为了有效地处理这些需求,MATLAB 提供了一些实用的函数来调整字符串数组的表现形式。在本板块中,我们将重点关注如何使用这些函数来实现字符串的格式调整。

我们之前在5.2.3节中已经介绍了strjust函数,这是一个强大的工具,用于调整字符数组中文本的对齐方式。它同样适用于字符向量元胞数组和字符串数组。让我们先快速回顾一下strjust函数的基本用法:

newStr = strjust(str) 在 str 中返回右对齐形式的文本。如果 str 具有尾随空格字符,则它们将变为 newStr 中的前导空格字符。如果 str 不包含尾随空格字符,则 strjust 返回未经更改的 str。

newStr = strjust(str,side) 返回在 side 指定的边对齐的文本形式。str 中的文本可以左对齐、右对齐或居中对齐。

下面我们介绍一个新的函数:pad函数,它用于为字符串添加前导或尾随字符,使得字符串的长度统一。pad函数的使用方法有许多种,下面我们通过MATLAB的官方文档来了解这个函数的具体用法。(注意,该函数也支持字符向量和字符向量元胞数组的文本类型,大家可以在官方文档中找到相应的说明。本节主要以字符串数组的应用为主,大家也可以使用其他的文本类型进行测试。本节后续要介绍的其他函数也是类似的,后面不再赘述)

用法1:newStr = pad(str) 在 str 中各字符串的末尾添加空格字符,但最长的字符串除外。如果 str 是包含多个元素的字符串数组或字符向量元胞数组,则 pad 会添加空格字符。newStr 中所有字符串的长度都与 str 中最长的元素相同。如果 str 是字符向量,或者是具有一个元素的字符串数组或字符向量元胞数组,则 pad 会原样返回 str。

大家可以观察pad函数和strjust函数得到的结果有何区别。

区别1:pad函数会修改字符串的长度,使得所有的元素长度相同,而strjust函数不会修改长度,它只会调整空格的位置;

区别2:pad函数默认是在字符串的尾部添加空格字符,而strjust函数默认是将空格移动到字符串的开头来实现右对齐。

用法2:newStr = pad(str,numberOfCharacters) 添加空格字符,使 newStr 中的字符串具有 numberOfCharacters 指定的长度。如果 str 中的任何字符串的字符数超过 numberOfCharacters,则 pad 不会修改它们。

用法3:newStr = pad(str,side) 在 side 指定的一侧添加空格字符。side 参数可以是 'left'、'right' 或 'both'。默认行为是在字符串右侧进行填充。

用法4:newStr = pad(str,numberOfCharacters,side) 在 side 指定的一侧添加空格字符,使其达到 numberOfCharacters 所指定的长度。

用法5: newStr = pad(___,padCharacter) 使用 padCharacter 指定的单个字符(而不是空格字符)来填充字符串。您可以使用上述语法中的任何输入参数。

事实上,大家如果使用实时脚本编写程序,MATLAB会给我们输入提示,这样可以很大程度上减少我们犯错的几率(下图来自MATLAB2023a版本,低版本的提示方式可能不同):

5.4.4.2    板块二:连接和拆分功能

在字符串处理中,连接和拆分字符串是两个基本且重要的操作。本节将重点介绍三个新引入的函数:join、split和splitlines。

事实上,在本章5.3.2节中,我们已经学过了strjoin和strsplit函数,join和split函数是它们的进阶版本。join函数扩展了strjoin函数的功能,允许我们对字符串数组进行按维度的连接操作;而split函数则作为strsplit的补充,解决了后者在处理非标量文本数据时的限制,使得拆分操作更加全面。此外,专为在换行符处进行拆分而设计的splitlines函数在处理包含多行文本的字符串时更为方便。

在本节中,我们将逐一介绍这些函数的用法和特点,以便更全面地理解和应用它们在各种文本处理场景中的强大功能。

1join函数

join函数是一个强大的工具,它可以将字符串数组中的元素按指定的维度进行连接。我们直接通过实例来学习它的用法(它也支持转义字符,例如\n, \t,大家可以自行测试):

当然,如果要连接的文本是1×N 或 N×1大小的字符串向量,则 strjoin函数和join函数的效果相同:

如果是1×N 或 N×1大小的字符向量元胞数组,那么两个函数返回的数据类型有所差异:

因此,如果要连接的数组是一维的字符向量元胞数组,使用strjoin函数更为方便,因为它返回一个字符向量,而join函数会返回一个包含单个元素的字符向量元胞数组。

2split函数

在5.3.2小节中,我们已经介绍了strsplit函数,这个函数只能用于处理字符向量或字符串标量(字符向量可以被视为标量文本,因此我们可以说strsplit函数只能处理标量文本)。然而,split函数提供了更广泛的应用范围,支持字符串数组、字符向量以及字符向量元胞数组的处理,这使得split函数在处理多维文本数据时更加灵活和强大。

为了更好地理解split函数的功能和用途,让我们首先比较一下它和strsplit函数在处理标量文本时的异同点。

从结果可以看出,两个函数都能有效地在空白字符处拆分标量文本。但strsplit函数返回的是一个行向量,而split函数返回的是列向量。

此外,我们也可以自己指定分隔符。此时,两个函数对于连续分隔符的处理有所差异:

如果存在多个连续的分隔符,strsplit函数默认会将连续的分隔符作为同一个分隔符处理,我们也可以使用名称-值参数'CollapseDelimiters'来指定连续分隔符的处理形式。而split函数不支持使用名称-值参数进行调整,我们通常需要手动删除结果中的空字符串:

注意,上面代码中我们使用了ss == "" 生成逻辑向量,并将这个逻辑向量作为ss的逻辑索引来删除空字符串。这种方法只适用于字符串数组情况,如果拆分后的ss是一个字符向量元胞数组,这个代码将不再适用。

此时,我们可以借助strcmp函数生成逻辑数组并进行逻辑索引:

下面我们再来看一个例子,在这个例子中,我们将指定多个分隔符:

现在,我们已经了解了strsplit和split函数在处理标量文本时的功能对比。接下来我们将深入探讨split函数的一个关键优势:它不仅能拆分标量文本,还能对多维的字符串数组和字符向量元胞数组进行拆分。

我们先来看一个简单的例子, s是一个大小为3×1的列字符串向量:

从结果可以看出,split函数对s中的每一个元素在空白字符处进行了拆分,将每一行拆分成了两个字符串标量,因此返回的结果是一个三行两列的字符串数组;而strsplit函数则不支持这种用法。需要注意的是:字符串数组s中的每个元素必须可被拆分成相同数量的子字符串,否则MATLAB会报错。

那我们应该如何处理呢?如果数量不同,我们可以使用for循环进行处理,并将拆分结果保存到元胞数组中。

此外,如果输入的s是一个1×M的字符串数组或元胞数组,MATLAB会返回一个1×M×P的数组,其中P是拆分后子文本的数量。同样地,对于N×M的字符串数组或元胞数组,返回的将是一个N×M×P的数组:

注意:这里返回的结果是一个三维的数组。由于本课程的定位是MATLAB入门,因此这一部分的内容不作要求。感兴趣的同学可以在b站观看专门的视频:MATLAB中的高维数组——入门知识。高维数组在图像处理、深度学习等领域有着广泛的应用。

在实际应用中,我们通常使用split函数来处理N×1的字符串数组,这是因为在大多数情况下,字符串数组的处理需求主要集中于这种形式。另外,MATLAB官方文档上提供了split函数的其他使用方法,例如分隔符delimiter可以指定为pattern 数组、可以有两个返回值等,感兴趣的同学可以自行查阅。

3splitlines函数

splitlines函数用于在换行符处拆分字符串,即它固定了分隔符delimiter为换行符,因此我们可以使用 splitlines(s) 来代替split(s,newline) :

5.4.4.3    板块三:替换和插入功能

在本小节,我们将介绍replaceBetween、insertAfter 和 insertBefore函数,它们分别实现了在字符串中替换和插入文本的高级操作。

事实上,在本章5.3.2节中,我们已经介绍了 strrep 函数,它用于将旧文本替换成新文本。此外,我们还探讨了 MATLAB 在2016b版本中推出的 replace 函数。让我们通过几个实例快速回顾这些函数的基本用法,为接下来的学习打下坚实的基础:

在此基础上,我们将介绍本小节的三个新函数。

1replaceBetween函数

replaceBetween函数专门用于在字符串的指定起点和终点之间替换子字符串。它提供了一种精确控制替换范围的方法,使我们能够针对字符串的特定部分进行修改,而不影响其他部分。(注意,函数名称的大小写是固定的,不能写成小写的replacebetween)

我们先通过MATLAB官网的帮助文档介绍它的基本使用方法:

newStr = replaceBetween(str,startPat,endPat,newText) 将str中的子字符串替换为 newText 中的文本。被替换的子字符串出现在子字符串 startPat 和 endPat 之间。但是,replaceBetween 不会替换 startPat 和 endPat 本身。replaceBetween 返回的结果为 newStr。newText 参数包含的字符数可以不同于它所替换的子字符串。

如果 str 是字符串数组或字符向量元胞数组,replaceBetween 将替换 str 的每个元素中的子字符串。输出参数 newStr 的数据类型与 str 相同。

newStr = replaceBetween(str,startPos,endPos,newText) 替换 str中的子字符串。被替换的子字符串出现在 str 中 startPos 和 endPos 之间的位置,包括这两个位置上的字符。

从上方的介绍可以看出,这里的起点和终点有两种表示方法。以str等于"ABCDEFGHIJ"为例,假设我们想将子字符串"DEF"替换成"*",我们可以通过以下两种方式指定其位置:

再来看一个例子,s中保存着一些单词,假如我们想将s中每个单词最后的两个字符替换成"**",我们可以这样做:

上方代码中,变量n表示字符串数组s中各元素的长度。由于我们的目标是替换每个字符串的最后两个字符,因此起始位置被设定为 n-1(每个字符串长度减 1,即倒数第二个字符的位置),结束位置为 n(即每个字符串的最后一个字符的位置)。

replaceBetween函数可以使用下面的名称-值参数:

newStr = replaceBetween(___,'Boundaries',bounds) 强制包含或不包含在上述任一语法中指定的开始和结束位置。当 bounds 为 'inclusive' 时,包含开始和结束位置;当 bounds 为 'exclusive' 时,不包含开始和结束位置。

另外,如果 str 是一个字符串数组或字符向量元胞数组,那么表示起点和终点的参数可以与str具有相同的大小(前面举的例子都是标量)。

例如:如果 str 是一个 2×1 字符串数组,那么replaceBetween(str,[7;8],[11;10],newText)将替换 str(1) 中从第七个到第十一个位置之间的子字符串,以及 str(2) 中从第八个到第十个位置之间的子字符串。

以上便是 replaceBetween 函数在不同情景下的应用。尽管它在实际使用中可能不如 strrep 或 replace 函数那样频繁,但了解其功能对于处理特定的字符串操作是有益的。

2insertAfter函数和insertBefore函数

insertAfter函数可以在指定的子字符串后面插入新的字符串,和replaceBetween函数类似,子字符串的位置可以通过两种方式指定:

newStr = insertAfter(str,pat,newText) 将在 str 中 pat 所指定的子字符串后插入 newText,并将结果返回为 newStr。如果 pat 在 str 中出现多次,insertAfter 将在每次出现的 pat 之后插入文本。

如果 str 是一个字符串数组或字符向量元胞数组,insertAfter 将在 str 的每个元素中插入 newText。输出参数 newStr 的数据类型与 str 相同。

newStr = insertAfter(str,pos,newText) 将在 str 中 pos 所指定的位置后插入 newText 指定的文本。

insertBefore函数和insertAfter函数的用法完全相同,它可以在指定的子字符串前插入字符串。

下面我们来看例子:

练习题:给定下面的字符串数组s,请在s中的"+"和"="的前后插入空格:

有同学可能会想使用下面的代码,但是MATLAB会报错:

下面我们借助for循环来解决这个问题:

思考:循环体内的两行代码能否使用其他的方法代替?

s = replace(s,tmp(ii)," "+tmp(ii)+" ");

5.4.4.4    板块四:提取功能

前面小节中,我们探讨了字符串的连接、拆分、替换、插入等操作。接下来,我们将聚焦于字符串的提取功能,这是处理文本数据时不可或缺的一环。在这一部分,我们将介绍三个实用的函数:extractBetween、extractAfter 和 extractBefore。这些函数使我们能够灵活地提取字符串中的特定部分。

1extractBetween函数

extractBetween函数用于提取起点和终点之间的子字符串,我们直接引用MATLAB官方文档来介绍它的使用方法:

newStr = extractBetween(str,startPat,endPat) 从 str 的子字符串 startPat 和 endPat 之间提取子字符串。提取的子字符串不包括 startPat 和 endPat。

如果 str 是一个字符串数组,则 newStr 也是一个字符串数组。否则,newStr 为字符向量元胞数组。如果 str 是一个字符串数组或字符向量元胞数组,extractBetween 将提取 str 的每个元素中的子字符串。

newStr = extractBetween(str,startPos,endPos) 从出现在位置 startPos 和 endPos 之间的 str 中提取子字符串,包括这些位置处的字符。extractBetween 将子字符串作为 newStr 返回。

newStr = extractBetween(___,'Boundaries',bounds) 强制包含或不包含在上述任一语法中指定的开始和结束位置。当参数 bounds 设置为 'inclusive' 时,表示包含开始和结束位置;当参数 bounds 设置为 'exclusive' 时,表示不包含开始和结束位置。举个例子,extractBetween(str, startPat, endPat, 'Boundaries', 'inclusive') 返回 startPat、endPat 以及它们之间的所有文本作为 newStr。

从上方介绍可以看出,extractBetween函数的调用方法和我们前面介绍的replaceBetween函数非常相似,下面我们来举几个例子:

2extractAfter函数和extractBefore函数

这两个函数分别用于提取指定位置后和指定位置前的子字符串,它们的使用方法类似于insertAfter函数和insertBefore函数。下面是extractBefore函数的使用方法:

newStr = extractBefore(str,pat) 提取以 str 的第一个字符开头并在 pat 指定的子字符串之前结束的子字符串。如果 pat 在 str 中多次出现,则 newStr 是 str 中从 str 的开始一直到 pat 第一次出现的位置的内容。

如果 str 是一个字符串数组或字符向量元胞数组,extractBefore 将提取 str 的每个元素中的子字符串。输出参数 newStr 的数据类型与 str 相同。

newStr = extractBefore(str,pos) 提取以 str 的第一个字符开头并在 pos 指定的位置之前结束的子字符串。(注意:它们没有'Boundaries'参数)

extractAfter函数和extractBefore函数的用法完全相同,下面来看它们的例子:

下面我们再来看一个实际生活中的例子。字符串数组s中保存着日期和温度数据,请从s中提取年、月、日以及当天的温度,并将提取后的结果保存到数值矩阵M中。

拓展:MATLAB在2020b版本推出了extract函数,它主要结合pattern 数组使用,以从字符串中提取满足特定模式的子字符串。下一章我们要学的正则表达式能够完全替代这个新函数。

5.4.4.5    板块五:删除功能

在处理文本数据时,我们经常面临着移除字符串中特定部分的需求。无论是出于数据清洗的目的,还是为了实现格式的统一或进行简单的文本编辑,高效且准确的删除操作都显得尤为重要。在本节中,我们将重点介绍两个实用的字符串删除函数:erase 和 eraseBetween。erase 函数使我们能够轻松地移除字符串中不需要的片段,而 eraseBetween 函数则用于删除指定位置的字符串。这两个函数将为我们提供灵活而高效的字符串删除解决方案。

1erase函数

erase函数用于删除字符串内的子字符串,它的用法如下:

newStr = erase(str,match) 删除 str 中 match 的所有实例。erase 函数将其余文本返回为 newStr。

如果 match 是数组,则 erase 将删除 match 的每个元素在 str 中出现的每个实例。str 和 match 参数不需要具有相同的大小。

2eraseBetween函数

eraseBetween函数用于删除起点和终点之间的子字符串,它的用法如下:

newStr = eraseBetween(str,startPat,endPat) 删除 str 中出现在子字符串 startPat 和 endPat 之间的所有字符,但不删除 startPat 和 endPat 本身。eraseBetween 会将剩余文本作为 newStr 返回。

如果 str 是一个字符串数组或字符向量元胞数组,eraseBetween 将删除 str 的每个元素中的字符。输出参数 newStr 的数据类型与 str 相同。

newStr = eraseBetween(str,startPos,endPos) 删除 str 中出现在位置 startPos 和 endPos 之间的所有字符,包括这两个位置上的字符。

newStr = eraseBetween(___,'Boundaries',bounds) 强制包含或不包含在上述任一语法中指定的开始和结束位置。当bounds为'inclusive'时,包含开始和结束位置;当 bounds 为 'exclusive' 时,不包含开始和结束位置。例如,eraseBetween(str,startPat, endPat,'Boundaries', 'inclusive') 删除 startPat、endPat 以及它们之间的所有文本。

下面我们来看eraseBetween函数的例子:

5.4.4.6    板块六:查找功能

在文本分析中,查找特定模式(这里说的特定模式包括子文本以及MATLAB在 2020b版本引入的 pattern 类型)是一项至关重要的常规任务。我们之前学习过 strfind 函数,它专门用于定位特定文本并返回相应的索引位置。然而,MATLAB在文本查找方面的能力不止于此。为了满足更广泛的需求,MATLAB提供了一系列更加实用的函数。

本节中,我们将学习以下四个新的函数:contains、count、startsWith和endsWith函数。这些函数能够检测字符串中是否包含特定模式,还可以统计其出现次数,并判断字符串的开头或结尾是否符合特定的模式。接下来,让我们深入了解这些函数的功能和应用。

1contains函数

contains函数用于确定字符串中是否有特定的模式,它的用法如下:

如果 str 包含指定的模式,TF = contains(str,pat) 将返回 1 (true),否则返回 0 (false)。

pat表示搜索模式,指定为下列值之一:字符串数组、字符向量、字符向量元胞数组、pattern 数组(自 R2020b 开始提供)

如果 pat 是一个包含多个模式的数组,则当 contains 在 str 中发现任何 pat 元素时,它将返回 1。

如果 str 是字符串数组或元胞数组,则 TF 是与 str 具有相同大小的逻辑数组。

TF = contains(str, pat, 'IgnoreCase', true) 在确定 str 是否包含 pat 时将忽略大小写。

下面我们来看例子:

思考题:给定一个字符串数组s,判断s中哪些元素中包含数字0至9。

2count函数

count函数用于计算字符串中模式的出现次数,它的用法如下:

A = count(str,pat) 返回 pat 在 str 中的出现次数。

如果 pat 是包含多个模式的数组,则 count 返回 pat 的所有元素在 str 中出现的总次数。count 从左到右依次匹配 pat 的元素。str 中的文本段只能匹配一次。

A = count(str,pat,'IgnoreCase',true) 在统计 pat 的出现次数时,将忽略大小写。

下面我们来看例子:

3startsWith函数和endsWith函数

startsWith函数和endsWith函数分别用于判断字符串是否以特定的模式开头或结尾,以startsWith函数为例,它的使用方法如下:

如果 str 以指定的模式开头,则 TF = startsWith(str,pat) 返回 1 (true),否则返回 0 (false)。

如果 pat 是包含多个模式的数组,则 startsWith 在发现 str 以 pat 的任一元素开头时将返回 1。

在确定 str 是否以 pat 开头时,TF = startsWith(str,pat,'IgnoreCase',true) 忽略大小写。

endsWith函数和startsWith函数的用法完全相同,下面来看它们的例子:


  点击下方的CSDN专栏阅读下一篇文章:

MATLAB入门课程专栏

  • 48
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值