罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

MATLAB、字符串和正则表达式

我很高兴地介绍杰森·布雷斯劳本周,我们的客人的博主,他给了我们承担MATLAB,字符串和正则表达式。

当你想到文本处理,你可能想到Perl,你应该。Perl是文本处理的事实上的标准,为任务创建,是微调,让它尽可能的简单。继续与我的思路的前提,当你想到Perl,你最可能想到的正则表达式。随后,当你想到正则表达式,您可能认为,“恶心!”

如果你不熟悉正则表达式,他们提供一种机制来描述文本中的模式,匹配或替换。他们通常被认为是非常有用的,丑陋的,很难理解和使用。Perl创建处理文本,正则表达式根深蒂固到它的语言。最基本的运营商匹配和替换,这两个都有内置的正则表达式。几乎所有Perl程序使用正则表达式,正则表达式的想法很可能导致Perl,反过来。

MATLAB隐藏的优势之一是其处理文本处理的能力。MATLAB支金宝app持所有必要的文件I / O函数,字符串函数,提供了一个广泛的选择,但最重要的是,MATLAB已经装入的正则表达式。

文本处理中对MATLAB的强项:矩阵。在Perl中,字符串是一个原子数据类型,这让他们特别注意从语言。在MATLAB, char类型的字符串是一维矩阵,MATLAB可以对待他们,其他的矩阵。这是非常有用的,如果你想对字符串执行数学。这听起来荒谬的如果你思考的特征值文本文件,但是有用的数学可以进行文本,例如加密。

例如,你可能见过一个文章已经在互联网上流传,推测,人们可以很容易地用每个单词读文本炒,只要每个单词的第一个和最后一个字母。Jamie Zawinski写了一个Perl脚本在用户输入执行这个匆忙。是脚本剥夺了其核心代码:

而(< >){foreach(分裂((\ w +) /)){如果(m / \ w /){我@w =分裂(/ /);我的美元= @w转变;我的Z =流行@w美元;打印一个美元;如果(定义(Z)){我$ = $ # w + 1;当我(我——美元){$ j = int兰德($ i + 1);@w [i, j]美元= @w [j,我美元];}foreach (@w) {print $ _;}印刷美元Z;其他}}{打印“$ _”; } } }

在MATLAB轻易可以做到这一点,使用动态正则表达式的新特性正则表达式在2006年发布。

而真正的线=输入(”、“s”);行= regexprep(线,(? < = \ w) \ w {2,} (? = \ w)”、“$ {$ 0 (randperm(长度(0美元)))}”);disp(线);结束

注意正则表达式之前评估MATLAB代码替换文本。这使得它可以调用MATLABrandperm函数。

字符串函数的在MATLAB的金宝app支持下,特别是正则表达式,这是更容易使用,随后比Perl用于文本处理更有效。

优势MATLAB正则表达式

有几个差异常在Perl的正则表达式和MATLAB实现。这些差异在语言的细微差别,如缺省选项和语法词了。一些有利的方面MATLAB / Perl的正则表达式指定标记和案例保存。

叫牌

我发现,一旦有人开始使用正则表达式,他们发现一个引人注目的特点是令牌,也称为捕捉组。令牌是由顶级附加一个正则表达式的子表达式。这些标记可以作为输出正则表达式函数,反向引用在相同的模式,作为参数修改替换文本regexprep。如果你喜欢在正则表达式中使用的令牌,你会喜欢使用命名的令牌。

指定的标记特性允许您指定的名称附加捕捉标记子表达式。然后令牌可能提到的名字,而不是数量。这使得表达清晰,不易bug。这是因为附加两个表达式将改变指数的令牌。例如,编写一个表达式提取月,一天,从一个日期没有使用命名标记:

> >日期= regexp (“11/26/1977”,“(\ d +) / (\ d +) / (\ d +)”,“令牌”);> >日期{:}ans =‘11’‘26’”1977”

如果上面的代码是在一个函数中,天将被称为日期{2}。把这个例子使用命名的标记:

> >日期= regexp(‘11/26/1977’,‘(? <月> \ d +) /(? <天> \ d +) /(? <一> \ d +) ', '名称')日期=月:“11”:“26”:“1977”

现在一天可以称为date.day。如果欧洲的模式也需要匹配日期格式的dd.mm.yyyy吗?第一个模式可以写成:

> >日期= regexp (“11/26/1977”,“(\ d +) / (\ d +) / (\ d +) | (\ d +)。(\ d +)。(\ d +)”,“令牌”);> >日期{:}ans =‘11’‘26’‘1977年> >日期= regexp (“26.11.1977”,“(\ d +) / (\ d +) / (\ d +) | (\ d +)。(\ d +)。(\ d +)”,“令牌”);> >日期{:}ans =‘26’‘11’”1977”

但是,看到令牌的顺序是不可区分的。同样的例子可以固定使用命名的标记:

> > =日期正则表达式(“11/26/1977”,…(? <月> \ d +) /(? <天> \ d +) /(? <一> \ d +) |(? <天> \ d +)。(? <月> \ d +)。(? <一> \ d +),…'名称')日期=月:“11”:“26”:“1977年> >日期= regexp (“26.11.1977”,…(? <月> \ d +) /(? <天> \ d +) /(? <一> \ d +) |(? <天> \ d +)。(? <月> \ d +)。(? <一> \ d +),…“名字”)日期=月:“11”:“26”:“1977”

正如你所看到的,命名标记明确表达,结果和周围的代码。

情况下保存

不区分大小写是这样一个模式匹配的基本方面,MATLAB强调它作为一个单独的内置函数,regexpi。许多程序使用这个选项在搜索和替换功能。不幸的是,尽管这些实例区分大小写的匹配,他们不妥善解决也需要动态替换。作为一个例子,一个单词大写开头的句子应该保持大写后更换。MATLAB承认这一需要。除了提供选项将忽略这种情况和匹配的情况下,MATLAB还提供选择保存。为了支金宝app持这一点,regexprep有以下选项来处理情况:matchcase,ignorecasepreservecase。这些示例中所示的差异是:

> > regexprep(汽车,汽车,汽车,汽车,汽车”,“车”、“船”,“matchcase”) ans =汽车,汽车,汽车,汽车,船> > regexprep(的汽车,汽车,汽车,汽车,汽车”,“车”、“船”,“ignorecase”) ans =一艘船,一艘船,一艘船,一艘船,一艘船> > regexprep(的汽车,汽车,汽车,汽车,汽车”,“车”、“船”,“preservecase”) ans =一艘船,一艘船,一艘船,一艘船,一艘船

要注意的是preservecase选择你最有可能想要它。

MATLAB的正则表达式

MATLAB正则表达式函数功能齐全的和精致的文本处理工具。随着MATLAB提供的其他支持文本操作,该金宝app套件在MATLAB是最简单和最简单的方法写字符串处理代码。当你下一个文本处理,MATLAB,也许你不需要想,“恶心!”

  • 你用MATLAB听从Perl的文本处理吗?
  • 有功能,使用Perl的文本处理缺席MATLAB ?
告诉我关于它的在这里


  • 打印
  • 发送电子邮件

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。