尉氏做网站,天眼查询个人信息免费,wordpress 关闭feed,电商网站模版讲解视频#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。
MATLAB教程新手入门篇#xff08;数学建模清风主讲#xff0c;适合零基础同学观看#xff09;_哔哩哔哩_bilibili 正则表达式可以由一般的字符、转义字符、元字符、限定符等元素组… 讲解视频可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。
MATLAB教程新手入门篇数学建模清风主讲适合零基础同学观看_哔哩哔哩_bilibili 正则表达式可以由一般的字符、转义字符、元字符、限定符等元素组成下面我们介绍MATLAB的正则表达式中一些常用的语法规则。 一、元字符
正则表达式中的元字符是一些特殊字符它们具有特定的含义用于匹配具有某种共同特征的单个字符是实现灵活匹配的关键。
1.: 元字符.用于匹配任何单个字符且能连续使用。
上面代码的输出结果为[8 20 31 49]。这四个数字表示在原字符串 str 中与正则表达式s...t匹配的子字符串的起始位置。
如果我们想同时得到结束的位置则可以给两个返回值
大多数情况下我们更希望直接得到正则表达式匹配到的文本而不是它们对应的位置。为此我们可以在regexp函数中添加一个输入参数match
需要注意的是regexp函数在匹配时默认是区分大小写的。如果想进行不区分大小写的匹配可以使用regexpi函数
2[c1c2c3]: 匹配包含在方括号中的任意一个字符可包含转义字符。另外如果方括号中存在特殊字符例如表示任意字符的元字符.则它会被当作普通字符来处理。
3[^c1c2c3]: 匹配不包含在方括号中的任意一个字符相当于[c1c2c3]表示的字符的补集。
观察上面代码返回的结果我们得到了一个包含六个元素的字符串数组。值得注意的是第三个元素是 shot这是一个以空格开头的字符串。这是因为空格字符也是除了s之外的任意字符之一所以它也符合正则表达式[^s]...t的条件。
如果我们希望同时排除以空格或者s开头的字符串那么我们可以在中括号中加入一个空格即将正则表达式修改为[^s ]...t。这样执行匹配会得到以下结果
4[c1-c2]: 匹配从c1到c2范围内的任意单个字符即从c1到c2的Unicode编码范围内的字符。例如[1-6]等价于[123456]意味着它将匹配数字1到6中的任意一个再举个例子[h-m]等价于[hijklm]它会匹配字母h到m中的任意一个。
5\s: 匹配单个空白字符例如常见的空格( )、换行符(\n)、水平制表符(\t)、回车符(\r)等。(注意\s的写法类似于转义字符实际上它是正则表达式中的元字符)
注意MATLAB官网在介绍\s时认为它等同于[ \f\n\r\t\v]实际上这里的描述并不完全准确我们可以通过下面的代码获取它能匹配的所有空白字符的Unicode编码
6\S: 匹配单个非空白字符可以理解为\s的补集意味着它将匹配除了\s能识别的25个空白字符之外的任何其他字符。
7\d: 匹配单个数字字符。
注意MATLAB官网认为\d等同于[0-9]实际上这个描述并不完全准确。我们可以通过类似于\s中的代码来获取所有能够被\d识别的数字字符的Unicode编码。大家只需要将 regexp函数中的正则表达式由\s修改为\d即可。
运行这段代码会返回一个包含370个元素的向量。这个向量中的前十个元素分别对应字符0到9的Unicode编码48到57即我们日常使用的阿拉伯数字。后面的360个元素代表一些特殊的数字体系这些字符在中英文语境下的使用频率较低仅供了解即可。 8\D: 匹配单个非数字字符可以理解为\d的补集。
9\w匹配单个的数字、字母无论大小写或者下划线。
值得注意的是这里的“字母”并不局限于英文字符集中的a-z和A-Z而是扩展到了所有语言中的字母字符。因此中文汉字也能被\w所识别。实际上MATLAB的官网上有这样的描述对于英语字符集\w等同于[a-zA-Z_0-9]。然而这一描述仅限于英文语境。在更广泛的多语言环境中\w的匹配范围要广泛得多。 10\W匹配单个的非数字、非字母无论大小写且非下划线的字符。这包括标点符号、空白字符、控制字符以及其他特殊字符可以视为\w的补集。
至此我们已经深入探讨了使用频率较高的十个元字符。这些元字符在正则表达式中发挥着至关重要的作用。此外MATLAB官网上还给出了两组不常用的元字符\oN或\o{N}、\xN或\x{N}它们分别与八进制和十六进制的数值表示形式有关使用频率很低。
另外有一个要注意的地方元字符.可以匹配任意单个字符那么如何匹配.字符本身答案是使用\.或者[.]进行匹配。
二、限定符
限定符也称为量词是正则表达式中用于精确控制字符在文本中出现次数的工具。它们为正则表达式的匹配提供了更加精准的控制。下表截取自MATLAB官网介绍了六种限定符及其示例注意下表某些示例并不准确大家可以暂时忽略或者听配套的讲解视频 下面让我们通过三个具体的例子来深入理解限定符在正则表达式中的应用。
例1匹配手机号码 上面代码中s是一个包含三个元素的字符串数组我们构造了一个正则表达式来匹配连续出现的11位数字。另外我们使用的正则表达式是[0-9]{11}绝大多数情况下你也可以使用\d{11}替代这样更为简洁。最终返回的结果c1是一个元胞数组里面有三个数据每个数据分别表示s中对应元素匹配的结果。 接下来请大家思考下面两个问题1 能否修改上方的正则表达式来同时匹配座机号码 只需要将正则表达式修改为[0-9]{3}-?[0-9]{8}或者\d{3}-?\d{8}就能够匹配到座机号码。因为字符-出现的次数是0次或者1次因此我们可以使用-?进行匹配。2 这个正则表达式是否存在漏洞 确实存在潜在的漏洞。例如如果字符串中包含类似于圆周率这样的长数字序列如“3.14159265358”则正则表达式可能会错误地匹配其中的一部分数字。尽管这种情况在实际应用中可能较少见到但仍然需要注意正则表达式的精确性和适用性。为了避免这种误匹配我们可以根据具体的应用场景进一步细化正则表达式的规则也可以对匹配后的结果进行进一步的筛选。 例2匹配QQ邮箱
最一般的QQ邮箱的格式为“QQ号qq.com”其中QQ号是一个5到10位的数字。为了从文本中提取这种格式的邮箱我们可以编写一个正则表达式来匹配它。 此外QQ邮箱还提供了英文邮箱格式QQ的英文邮箱规则如下必须以英文字母开头邮箱前缀即符号之前的字符的长度为3至18且只能包括大小写英文字母、数字和下划线并使用qq.com结尾。请重新写一段正则表达式来匹配QQ的英文邮箱。 例3匹配英文单词
s是一个字符串标量它用来保存一段英文请从s中提取出所有的英文单词。 另外有些英文单词比较特殊例如sixty-three和dont。现在请你思考上面的代码能正确匹配这两种单词吗如果不能应如何修改代码 事实上最下面的这种方法也存在漏洞我们来看一个比较特殊的例子 可以看到第5个单词被匹配为world多了一个单引号。要想解决这个问题我们可以考虑对ss使用strip(ss,)命令这样就能去掉这个多余的单引号。
当然使用正则表达式也能修复这一漏洞这需要用到正则表达式的条件运算符| 另外我们也可以使用下面这两种正则表达式得到的结果和s1完全相同
s3 regexp(s,[a-zA-Z]([-][a-zA-Z]|[-]{0}),match)
s4 regexp(s,[a-zA-Z]([-][a-zA-Z]|),match) 另外如果我们希望匹配字符|、*、和?本身我们可以使用\|、\*、\和\?也可以使用[|]、[*]、[]和[?]这和匹配字符.的方式相同。 此外我们可以利用成对的英文小括号来明确区分正则表达式的不同部分这不仅使得正则表达式的结构变得更加清晰而且也便于理解和修改。例如上面的例子中你可以把正则表达式改写为(\|)(\*)(\)这样改动后得到的匹配结果与原来完全一致。值得注意的是通过这种添加小括号的方式我们实际上创建了正则表达式中的捕获组。在这个例子中我们定义了三个捕获组第一个捕获组用于匹配|字符第二个捕获组匹配一个或多个*字符而第三个捕获组则匹配字符。在后续内容中我们将详细介绍捕获组的相关知识和它们的应用。
当然如果我们需要匹配小括号(和)本身同样可以通过使用\(和\)来实现或者将它们置于方括号内即[(]和[)]这些方法都是通用的。例如我们要匹配包含小括号的数学表达式 三、模式
模式用于控制限定符的匹配策略MATLAB的正则表达式支持三种模式贪婪Greedy模式、懒惰Lazy模式和独占Possessive模式。这些模式对于精确控制匹配行为至关重要。让我们通过一个实际例子来探讨模式的应用及其重要性。
假设我们有一个字符串标量s其中包含了两个网址我们希望通过正则表达式www.*com分别匹配这两个网址然而返回的结果却不是我们期望得到的 在此例中由于MATLAB的正则表达式默认采用贪婪模式*限定符尽可能地匹配更多字符直到找到字符串中的最后一个com。因此从第一个www到最后一个com之间的整个字符串都被匹配了。
为了能够分别匹配每一个网址我们应该采用懒惰模式。懒惰模式通过在限定符后面添加一个问号?来实现使得正则表达式匹配尽可能少的字符。一旦找到符合条件的匹配项它就会停止当前的匹配过程然后开始下一次匹配。这样从第一个www开始到遇到的第一个com结束完成第一次匹配随后MATLAB继续执行第二次匹配从而实现了对两个网址的分别匹配 再来举一个例子帮助大家理解正则表达式中的贪婪模式和懒惰模式 拓展独占模式本部分内容涉及到底层的算法知识初学者仅需了解即可
在深入了解贪婪模式和懒惰模式后我们已经见识到了正则表达式在字符匹配中的灵活性这两种模式能够满足绝大多数复杂的匹配需求。然而面对极大规模的文本处理的应用场景时正则表达式的匹配效率成为关键考虑因素。特别是在贪婪模式下可能有大量的回溯操作来寻找匹配结果某些时候这会导致匹配效率急剧下降这种现象被称为“回溯陷阱”。
独占模式的引入正是为了应对这一挑战。作为正则表达式的第三种模式独占模式提供了一种更高效的匹配策略。它与贪婪模式类似尽可能匹配更多字符但关键的区别在于一旦进行匹配就不会释放任何字符即便这可能导致整个匹配失败。这种策略显著减少了回溯操作的需求提高了匹配的效率。
在MATLAB中独占模式通过在限定符的后面添加一个加号来实现。现在我们通过一个具体的例子来演示独占模式在实际应用中的性能优势。假设我们需要在一个非常长的字符串中匹配特定的模式。为此我们人为构造了一个很长的字符串标量cc其中包含从1到10000的数字然后重复数字序列cc两次并插入了两个英文字段 对于本例题我们发现使用独占模式进行匹配的执行时间比贪婪模式少这是因为独占模式避免了不必要的回溯从而减少了计算量。然而这种模式也有其局限性尤其是在某些场合下可能无法成功匹配到期望的数据。
独占模式的一个主要局限性在于一旦开始匹配它不会放弃已匹配的字符即使这意味着整个表达式的匹配会因此失败。这种“一往无前”的匹配策略在某些情况下可能会导致匹配失败。考虑以下示例 在这个例子中使用贪婪模式能够成功匹配整个字符串1111111a1因为.*允许匹配任何字符直到字符串的末尾然后通过回溯找到最后一个1来完成匹配。相反当我们尝试使用独占模式进行匹配时结果是一个空的字符串数组。这是因为独占模式下的.*匹配了所有字符包括最后一个1由于独占模式下不会释放任何已匹配的字符因此正则表达式会因为缺少最后的1而导致匹配失败。
因此尽管独占模式在提高匹配性能方面展现出了显著优势特别是在处理大规模数据时能够有效减少回溯从而加快匹配速度它的使用却需慎重。这是因为独占模式的“一次匹配不回头”的特性可能限制了其在某些场景下的适用性。确保它适合于特定的匹配需求是使用独占模式的关键。
实际上在大多数正则表达式的应用场景中贪婪模式和懒惰模式已经足够应对绝大部分的匹配需求。贪婪模式通过尽可能多地匹配字符而懒惰模式则提供了更为精细的控制允许匹配尽可能少的字符。这两种模式在灵活性和易用性方面都优于独占模式使得它们成为日常使用中更为常见的选择。
总之了解各种模式的特点和适用场景可以帮助程序开发者更加精准地控制匹配行为优化正则表达式的性能并确保匹配结果符合预期。在选择使用哪一种模式时评估匹配需求的具体情况是至关重要的这不仅关乎匹配效率也影响到最终匹配结果的准确性。 四、分组运算
在处理文本数据时我们经常遇到只需提取特定部分信息的情况。这就需要运用到分组运算它允许我们在匹配过程中将关注点集中于文本的特定片段。以一个实际的例子为例假设我们需要从一段文本中提取学生的姓名。根据目前所学知识可通过以下方式编写代码 虽然这种方法可以达到目的但它需要额外的步骤来删除不需要的文本内容显得有些繁琐。为了简化这一过程我们可以利用正则表达式的分组运算功能直接在匹配时提取我们关注的文本片段。
使用分组运算来提取特定的文本内容既简单又高效只需遵循以下两个步骤
1创建捕获组通过将希望单独提取的文本内容用英文小括号()括起来我们便创建了一个捕获组。这个捕获组会在匹配过程中单独提取匹配到的文本。
2修改regexp函数的参数在调用regexp函数时将它的第三个输入参数设置为tokens。这样才会返回捕获组定义的特定部分。
以上述例子为例我们通过分组运算来直接提取姓名信息 每个元胞内包含一个由捕获组(\w*)匹配到的姓名字符串。如果需要的话你也可以将这个元胞数组转换成字符串数组类型 此外有同学可能会想能否在单个正则表达式中创建多个捕获组来匹配不同的信息答案是肯定的。例如如果我们想同时匹配这三名同学的姓名和昵称可以这样做 在这个例子中通过在正则表达式中定义两个捕获组我们成功地同时匹配了每个学生的姓名和昵称。regexp函数返回了一个包含三个元素的元胞数组表示匹配成功了三次。每个元胞中的数据都是包含两个元素的字符串数组分别对应两个捕获组匹配到的姓名和昵称。当然如果你希望将匹配结果保存到更方便操作的字符串数组中可以这样做 这样我们便得到了一个3×2的字符串数组每行包含一名学生的姓名和昵称。 接下来我们介绍两个拓展的知识点尽管它们的使用频率较低但它们给正则表达式的分组运算提供了额外的灵活性和控制能力。
拓展一同时使用多个参数返回不同类型的匹配结果
在处理文本数据时有时候我们不仅需要提取与捕获组匹配的特定文本还需要同时获得整个匹配的文本。MATLAB的regexp函数支持这种需求允许通过同时指定tokens和match参数来实现这样就能在单一函数调用中返回多种类型的匹配结果。例如 当然两个参数的顺序可以互换返回的结果将相应地调整顺序以匹配参数的排列顺序。
拓展二非捕获组
在之前的内容中我们学习了如何通过使用英文小括号()创建捕获组这种方式允许我们单独提取匹配的文本内容并通过tokens参数进行匹配。然而在某些情况下我们可能需要用到小括号但又不希望捕获这部分的匹配内容。这时我们可以利用(?:expr)来创建非捕获组其中expr代表我们希望匹配但不捕获的正则表达式部分。例如 五、定位点
定位点也被称为锚点它们使得正则表达式能够精确地与文本的开头或结尾匹配从而实现更为精细的匹配控制。下面我们介绍两种使用频率较高的定位点 它们的使用方法非常简单我们先举几个简单的例子 另外定位符^表示开头和$表示结尾也能同时使用 在第一个例子中由于字符串s中的开头数字和结尾字母之间还包含了其他的字符因此正则表达式无法找到完全符合条件的匹配项返回了一个空数组。
此外有同学可能会回想起我们在前一章学习的两个函数startsWith和endsWith。这两个函数与正则表达式中的定位符^表示开头和$表示结尾确实有着相似的功能。让我们通过一个具体的例子来探讨它们之间的联系提取出所有以元音字母开头的单词。 上面这段代码通过正则表达式^[aeiouAEIOU].*成功地筛选出了以元音字母开头的单词并将匹配结果重新拼接到一个字符串数组中。
作为对比我们同样可以使用startsWith函数来实现这一功能这提供了一个更为直接且易于理解的方法 通过指定元音字母列表作为startsWith函数的第二个参数我们可以快速得到同样的结果。这种方法不仅代码更为简洁而且在表达意图上更加直观。 六、正则表达式中其他的高级语法
至此我们已经介绍完MATLAB的正则表达式中一些基础和常用的语法规则涵盖了元字符、限定符、模式、分组运算和定位点等关键概念。然而正则表达式中还有一些高级语法我们没有介绍例如环顾断言、动态表达式、搜索标志等。对于绝大多数的文本处理任务掌握我们目前所学的知识点就足够了对高级语法感兴趣的同学请参考MATLAB的官网
正则表达式- MATLAB Simulink- MathWorks 中国 点击下方的CSDN专栏阅读下一篇文章
MATLAB入门课程专栏