搜索字符串时的压力?
当你要搜索一个字符串模式,而不仅仅是一个特定的字符串时,你的手会不会变得粘乎乎的?是否有挣扎的想法正则表达式让你汗流浃背?
好吧,别再担心了!现在,使用新的图案在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(“五个母音字母”)))……+字母模式+字母数字边界);
呸!那是一口!但也很可读。
评论
如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。