罗兰谈MATLAB的艺术

将想法转化为MATLAB

MATLAB,字符串和正则表达式

我很高兴向大家介绍杰森·布雷斯劳他是我们本周的客座博主,他为我们介绍了MATLAB、字符串和正则表达式。

当您考虑文本处理时,您可能会想到Perl,这也是应该的。Perl是文本处理中事实上的标准,它是为该任务创建的,经过了微调,使其尽可能简单。继续我对您思路的预设,当您想到Perl时,您很可能会想到正则表达式。随后,当您想到正则表达式时,您可能会想,“恶心!”

有些人可能不熟悉正则表达式,它们提供了一种在文本中描述模式的机制,用于匹配或替换。他们通常被认为非常有用,但丑陋,难以理解和使用。Perl是为处理文本而创建的,正则表达式深深植根于它的语言中。它最基本的操作符是match和substitute,这两个操作符都内置了正则表达式。实际上,每个Perl程序都使用正则表达式,正则表达式的思想很可能会导致Perl,反之亦然。

MATLAB的隐藏优势之一是它处理文本处理的能力。MATLAB支万博1manbetx持所有必需的文件I/O函数,并提供了广泛的字符串函数选择,但最重要的是,MATLAB有内置的正则表达式。

文本处理正是MATLAB的强项:矩阵。在Perl中,字符串是一种原子数据类型,这使它们受到语言的特殊照顾。在MATLAB中,字符串是char类型的一维矩阵,MATLAB可以像对待其他矩阵一样对待它们。如果您想在字符串上执行数学运算,这很有用。如果您正在考虑获取文本文件的特征值,这可能听起来很荒谬,但是可以在文本上执行有用的数学运算,例如使用密码学。

例如,你可能见过一个文章网上流传的一种说法是,只要每个单词的首字母和尾字母被保留下来,人们就可以轻松阅读每个单词被打乱的文本。杰米·扎文斯基写了一篇Perl脚本对用户输入执行这种置乱。下面是该脚本的核心代码:

而(< >){foreach(分裂((\ w +) /)){如果(m / \ w /){我@w =分裂(/ /);my $A = shift @w;my $Z = pop @w;打印一个美元;if (defined ($Z)) {my $i = $#w+1;While ($i——){my $j = int rand ($i+1);@w[$i,$j] = @w[$j,$i];} foreach (@w){打印$_;}打印$Z;}} else{打印"$_"; } } }

在MATLAB中,可以很容易地做到这一点,使用动态正则表达式,一个新的特征正则表达式Release 2006a。

当line = input(", 's');行= regexprep(线,(? < = \ w) \ w {2,} (? = \ w)”、“$ {$ 0 (randperm(长度(0美元)))}”);disp(线);结束

注意,正则表达式在替换文本之前计算MATLAB代码。这使得它可以调用MATLAB的randperm函数。

尤其是MATLAB对字符串函万博1manbetx数的支持正则表达式,它更容易使用,因此在文本处理方面比Perl更有效。

MATLAB的优点正则表达式

Perl和MATLAB实现正则表达式之间有几个不同之处。这些差异大多是语言上的细微差别,比如默认选项和换行符的语法。与Perl相比,MATLAB中正则表达式的一些优点是命名令牌和大小写保存。

叫牌

我发现,一旦有人开始使用正则表达式,他们发现的一个引人注目的特性是令牌,也称为捕获组。令牌是由正则表达式中的顶级括号子表达式创建的。对象的输出可以使用这些令牌正则表达式函数,作为后面相同模式中的反向引用,以及作为参数修改中的替换文本regexprep.如果您喜欢在正则表达式中使用标记,那么您将喜欢使用命名标记。

命名令牌特性允许您为捕获令牌的括号子表达式指定名称。然后可以通过名称而不是数字来引用标记。这使得表达式更清晰,也更不容易出现错误。这是因为附加两个表达式将改变令牌的索引。例如,编写一个表达式从日期中提取月、日和年,而不使用命名令牌:

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

如果上面的代码在一个函数中,day将被称为日期{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'

但是,看看符号的顺序是如何不可区分的。同样的例子可以使用命名令牌来修复:

>> date = regexp('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还提供了保留大小写的选项。为了支万博1manbetx持这一点,regexprep有以下选项来处理情况:matchcaseignorecase而且preservecase.以下例子显示了不同之处:

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

注意preservecaseOption执行您最可能希望它执行的操作。

正则表达式的MATLAB

MATLAB正则表达式函数是功能齐全、精细化的文本处理工具。除了MATLAB为文本操作提供的其他支持外万博1manbetx,MATLAB中的套件是编写字符串处理代码的最简单和最干净的方法。当你下次想到文本处理时,想想MATLAB,也许你不必想,“恶心!”

  • 你用MATLAB还是用Perl来处理文本?
  • 您在Perl中使用的文本处理功能是否有MATLAB所没有的?
跟我说说在这里

|
  • 打印
  • 发送电子邮件

评论

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