罗兰关于MATLAB的艺术

将想法转化为MATLAB

搜索字符串时的压力?

当你要搜索一个字符串模式,而不仅仅是一个特定的字符串时,你的手会不会变得粘乎乎的?是否有挣扎的想法正则表达式让你汗流浃背?

好吧,别再担心了!现在,使用新的图案在MATLAB环境下功能。在某些情况下,你甚至可以侥幸逃脱惩罚。

对于今天的帖子,我的合著者是Jason Breslau和Curtis Anderson,因为他们知道更多正则表达式比我,还有更多关于功能的细微差别。我们将通过展示几个例子来做到这一点。你可能还想看看二郎最近的推荐商品

内容

示例0:对于那些喜欢regexp的人

如果你喜欢,这个例子就是给你的正则表达式我不明白你为什么要考虑其他事情。您可以使用regexpPattern将您喜爱的正则表达式转换为模式,以便您可以利用代码功能。比较这两种方法,查看某些文本中是否包含字符串。

包含(str regexpPattern (expr))
~ cellfun (isempty,正则表达式(str, expr))

哪一个可以让你在每次阅读的时候都快速理解而不需要经过逻辑?

现在,对于那些真正愿意跳过的人来说,还有更多正则表达式更多的时候。

示例1:计数注释行

假设我想计算MATLAB文件中注释的行数(不是块注释)。这里是如何做到这一点正则表达式

codeFile = fileread (“num2str.m”);comments=regexp(代码文件,“^ \ s * %”“线人”);元素个数(评论)
ans=37

这很烦人,因为您必须了解lineanchors,而正则表达式有点难看。此外,它返回了一个我们并不真正关心的索引数组。相反,请尝试以下方法:

计数(代码文件、线边界+空格模式)+“%”
ans=37

我们仍然需要读取文件,并查找以%开头的行(忽略前导空格)。

例2:如何在文件中查找以元音开头的单词

假设我们想要得到一些关于以元音开头的单词的统计数据。

vowelWords = regexpi (codeFile,“\<[aeiou][a-z]*”“比赛”); howManyWords=长度(元音词)
howManyWords = 176

使用图案,我们首先搜索单词,这是字母字符。然后只找那些以元音开头的单词。

单词= extract(codeFile, letterpattern);vorwelwords1 = words(startwith (words, characterListPattern(“五个母音字母),“IgnoreCase”,真的));howManyWords =长度(vowelWords1)
howManyWords = 176

这里也许有更好的方法可以做到这一点!从元音列表中构建一个模式。然后寻找在字母前有边界的东西-一些空格,后跟元音,然后是单词的其他部分。

元音=不区分大小写模式(characterListPattern(“五个母音字母)); 元音words2pat=letterBoundary+元音+letterspatter(0,inf);元音words2=提取(代码文件,元音words2pat);howManyWords=长度(元音词2)
howManyWords = 176

假设我们只有想要这里的计数,我们可以用调用来替换前两行代码更有效地达到我们的目标。构建复杂模式的工作流的伟大之处在于它为您提供了多功能性。

高分子量= count (codeFile vowelWords2Pat,“无知案例”,真正的)
高分子量= 176

或者我可以代替信标(0,Inf)可选图案(字母图案).能够为函数提供模式startsWith包含是最大的胜利。

最佳实践

我们发现最好是通过连接小块来建立一个模式。它使您更容易理解您在做什么,您在哪里或没有应用大小写敏感性等。

例3:反向查找以辅音开头的单词

假设我们想要以辅音开头的单词。这是正则表达式方法

consRegexp = regexpi (codeFile,' \ <(? ![五个母音字母])[a - z] + '“比赛”);

使用一种模式

consPat =提取(codeFile,...字母数字边界+...~ lookAheadBoundary (caseInsensitivePattern (characterListPattern (“五个母音字母)))...+信标);

最后两者都不用正则表达式也不是辅音模式。相反,使用以元音词开头的否定词。这可能是最容易理解的。

conwords = words(~startsWith(words, caseinsensitivpattern (characterListPattern()))“五个母音字母))));

精明的读者会发现这里的答案并不一致。请参阅末尾的附录,了解详细信息以及如何使答案对齐。

示例4:查找具有特定扩展名的文件

在我们的测试系统中,我们审核了在一个阶段中使用的所有正则表达式,发现其中大约50%可以被替换endsWith没有任何模式。以前我们使用正则表达式但这对这项工作来说是一个巨大的打击。我认为寻找具有特定文件扩展名的文件可能是一个常见的用例。就像,

正则表达式(文件名,“美元. txt”)

它有两个bug !你需要空空如也“一次”

~ isempty(正则表达式(文件名,“美元. txt”,“一旦”))

而且你还必须避开圆点,这是每个人都忘了做的。

~ isempty(正则表达式(文件名,“美元\ . txt”,“一旦”))

而现在你只是简单地做了

endsWith(文件名,' . txt ')

有趣的是,它根本不使用模式,而是使用函数,endsWith,这可能需要一种模式。

假设您现在想要检查两个不同的扩展名,很容易完成。endsWith万博1manbetx支持多个搜索字符串,并将其视为。这比使用正确的模式进行搜索更快,但有点限制。

endsWith(文件名,[“.txt”、“.somethingElse”])

显式或

endsWith(fileName, ".txt" | ".somethingElse")

没有扩展名的文件呢

如果文件名以txt结尾或根本没有扩展名,该怎么办?

endsWith(fileName,'.txt')| | ~包含(fileName,'.'))

这是针对单个文件,没有完整的路径名。

你找得怎么样了?

你是否能够很好地利用MATLAB中的模式,并能够(或不能)消除一些或所有的使用正则表达式.让我们知道在这里

附录

正如承诺的那样,我将在这里描述为什么辅音答案不一致,以及如何使它们相同。

单词Variable有一组连续的字母。我们有一些名字在num2str代码也使用数字,例如,mat2str.这句话可以翻译成两个词,str.我们可以使用

文字=提取(代码文件、字母数字边界…+字母数字边界+字母数字边界);

这意味着正则表达式版本为:

consRegexp=regexpi(代码文件“\<(?![aeiou])[a-z]+\>”,“匹配”);

以及相应的模式:

conat = extract(codeFile,…)alphanumericBoundary +……~ lookAheadBoundary (caseInsensitivePattern (characterListPattern(“五个母音字母”)))……+字母模式+字母数字边界);

呸!那是一口!但也很可读。




发布与MATLAB®R2020b

|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。