[Powered by Google Translate] [研讨会：正则表达式的模式匹配]
[约翰·Mussman哈佛大学]
[这是CS50. CS50.TV]
好吧。好吧，欢迎大家。这是CS50 2012。
我的名字是约翰，我今天将讨论有关正则表达式。
正则表达式主要是一个工具，但有时也用
积极在代码本质模式和字符串相匹配。
所以这里有一个网络漫画XKCD。
在这个漫画有一个神秘谋杀案，杀手
随后有人在休假中，主角有
通过搜索寻找一个地址的200兆字节的电子邮件。
他们都放弃的时候，别人谁知道正则表达式 -
大概是一个超级英雄 - 猛扑下来，并写了一些代码
并解决了谋杀之谜。
因此推测，这将是东西，你将有权做
经过本次研讨会。
我们只是要提供一个简洁的语言介绍
给你足够的资金去后，更多的资源在自己的。
>> 因此，正则表达式看起来基本上是这样的。
在Ruby中，这是一个正则表达式。
这是不可怕的跨语言不同。
我们刚刚开始和斜线标记的正则表达式在Ruby。
，这是一个正则表达式来寻找电子邮件地址模式。
所以我们看到在第一位看起来任何字母数字字符。
这是因为电子邮件地址通常以字母字符开始。
然后任何特殊字符，然后由@符号。
然后同样的事情，域名。
，然后在2和4个字符之间寻找。com，。网，等等。
所以这是正则表达式的另一个例子。
因此，正则表达式的协议文本中找到的格局。
他们做比较，选择和更换。
所以第三个例子是查找所有目录中的电话号码54结束。
所以，大卫撕裂了CS50目录中我们可以搜索
一个模式在那里我们有括号，那么3个数​​字，然后结束括号，
3个数字，一个破折号，2个号码，然后54。
基本上，这将是我们如何来用正则表达式搜索。
>> 因此，有 - 我们已经做了一些事情，有点像CS50
正则表达式 - 例如 - 在dictionary.C文件
拼写检查问题集，你可能已经使用fscanf
读一个字从字典。
你可以看到的百分比45S正在寻找一个45个字符的字符串。
因此，它是有点像一个基本的正则表达式。
你可以有适合该法案在那里任意45个字符
和挑选那些了。
然后在最近的网络规划问题的第二个例子中
设置的发行代码为PHP，我们其实有一个简单的正则表达式。
而这一次只是简单地检查，如果网页中传递
匹配任何登录或注销登记。PHP。
然后返回真或假的基础上，正则表达式匹配。
>> 因此，当你使用正则表达式？
你为什么在这里呢？
所以你不希望有什么东西时，使用正则表达式
为你做这项工作更容易。
所以，XML和HTML是实际上相当棘手
正如我们将看到在一点点写正则表达式。
因此，有专门的那些语言的解析器。
你也需要经常会没事的权衡和准确性。
如果您正在尝试 - 让我们看到了一个电子邮件地址的正则表达式，
但是说你想要一个特定的电子邮件地址，并逐步
正则表达式可能会变得更加复杂，因为它变得更精确。
因此，这将是一个权衡。
你必须要确保你好吗正则表达式。
如果你确切地知道你正在寻找它可能会更有意义
投入的时间和写更有效的解析器。
最后，有一个历史的规律性问题
表情和语言。
事实上，正则表达式是强大得多
正则表达式的每一个正式意义上说。
>> 所以，我不想去太远的正式理论，
但大多数的语言，我们的代码实际上是不正规的。
这就是为什么有时正则表达式不考虑所有的安全。
所以基本上是一个乔姆斯基语言层次，
和正则表达式建立工会，​​串联，
Kleene星号操作，我们将看到在几分钟之内。
如果你有兴趣在理论上有不少对那里发生的引擎盖下。
>> 所以简史 - 只为这里的语境 - 定期集上来
在20世纪50年代，然后我们有简单的编辑器
注册成立的正则表达式 - 只搜索字符串。
grep的 - 这是一个命令行工具 - 是第一个
纳入正则表达式在20世纪60年代非常流行的工具。
在八十年代，Perl是 - 是一种编程语言，
采用正则表达式非常突出。
然后最近我们曾与Perl兼容的正则表达式
协议基本上在其他语言中使用许多相同的语法。
当然，最重要的事件是在2008年
那里是第一届全国正则表达式日，
我相信这是6月1日，如果你想庆祝。
>> 同样，只是一点点的理论在这里。
因此，有几种不同的方法构造正则表达式。
一个简单的方法是，你要构建的表达
上运行的字符串解释 - 基本上是建立一个小的迷你节目，
将分析一个字符串的作品看，“哦，这符合正则表达式或不？”
然后运行。
所以，如果你有一个非常小的正则表达式，这可能是
最有效的方式做到这一点。
然后，如果您 - 另一种选择，就是保持重建
表达你走了，那是模拟的可能性。
这些早期的尝试正则表达式算法
相对简单，比较快的，但没有很大的灵活性。
因此，做一些事情，我们要看看
我们今天不得不做更复杂的正则表达式
实现可能要慢得多，所以是牢记
还有一个正则表达式拒绝攻击品种
这些新的实现利用的潜力
正则表达式变得非常复杂。
在大致相同的意义上，我们看到在缓冲区溢出攻击，
你有工作做出递归循环，攻击
溢出的内存容量。
部分内容的方式是一个正则表达式的官方复数
牛在盎格鲁 - 撒克逊的比喻。
>> 好吧，所以Python库，许多人在这里你的Mac计算机，
所以你实际上可以拉在你的屏幕上。
Python内建正则表达式。
所以Python预装在Mac电脑上，也可在网上在这个环节。
所以，如果你看，你可以暂停，并确保了Python
我们玩在这里。
有一个手动网上，所以如果你只需要输入到您的计算机的Python
你将看到的版本出现在终端。
所以我提供了一个链接的手册第2版的Python以及小抄。
有一个版本的Python，但你的Mac不一定
配备预加载。
所以不可怕不同。
好了，所以使用正则表达式在Python中的一些基本知识。
>> 所以在这里我用一个非常简单的表达，所以我做了Python的进口重
然后拿了re.search中的结果。
搜索需要两个参数。
第一个是正则表达式，而第二个是文本
或者你要分析的字符串。
然后我打印出来的result.group。
因此，这些都是我们要看到今天的2个基本功能
学习正则表达式。
因此，只要打破这个正则表达式
h后，\ W，则m \ W只是在那里接受任何字母字符。
所以，在这里，我们正在寻找一个“H”，然后另一个字母字符
然后米，所以这里将匹配火腿
“亚伯拉罕·林肯和火腿的三明治。”
这是该组的结果。
我们可以做的另一件事是在Python中使用我们之前的文本字符串。
所以我想我会继续前进，拉在此处进行。
Python的进口重。
如果我是做同样的事情 - 让我们说文字是，
“亚伯拉罕，”让我们放大 - 我们去那里。
文字是：“亚伯拉罕吃火腿肠。”
好吧，然后导致= re.search。
，然后我们的表达可以是小时，然后我会做点米。
所以只需点的任何字符，包括数字是不是一个新的行，
个标志，类似的事情。
文本 - 繁荣 - 然后result.group - 耶。
所以这是如何实现的基本功能在这里。
如果我们有一个文本环 - 那个疯狂的文本 - 包括很多回斜线说
字符串里面的东西，可能看起来像转义序列，
那么我们可能想要使用原始的文本输入，以确保接受。
只是看起来像。
因此，如果我们正在寻找我们不应该为他们每个人在那里找到任何东西。
但是，这是你将如何实现它;只是之前的字符串
正则表达式，你把字母r。
>> 好了，让我们继续下去。
好吧 - 所以让我们来看看一对夫妇重复模式。
所以，你想要做的一件事，是重复的东西
因为你是通过搜索文本。
因此，做一个由任意数量的b - 你槟*。
然后还有一系列的其他规则。
你可以看看所有这些了，我只是通过一些运行
最常用的。
所以AB +是一个由任意n大于0的b。
AB？是一个0或1的b。
AB {N}是一个由N b的，然后依此类推。
如果你有2个大括号中的数字，你指定范围
可以是可能的匹配。
因此，我们将看看一对夫妇在一分钟内重复模式。
因此，两件事情要记住，当使用这些模式匹配工具。
所以说，我们想看看HM，“亚伯拉罕·林肯使得火腿的三明治。”
因此，我改变亚伯拉罕亚伯拉罕·林肯的名字。
现在我们正在寻找什么是返回此搜索功能，
并且在这种情况下，只返回火腿。
它，只是因为搜索时，自然需要最左边的队列。
所有的正则表达式，除非你指定，否则将这样做。
如果我们想找到所有有一项功能 - 全部找到。
所以这可能只是看起来像所有：=通过re.findall（'h.m'，文字）
然后all.group（）。
所有生产火腿及火腿，在这种情况下，两者的字符串亚伯拉罕每个火腿。
因此，这是另一种选择。
>> 太好了。要记住的另一件事是，正则表达式取最大直观的。
让我们看看下面这个例子。
这里我们做了最左边的搜索，然后我尝试更大的搜索
使用Kleene星操作。
因此，“亚伯拉罕·林肯使火腿三文治，”我只回来
米作为一个结果。
该错误的原因是，我可以采取任何数量的
H公司的，因为我没有指定什么去H和M之间。
唯一的例子，有米 - 唯一的例子米
h的任意数量的串m。
然后我尝试一遍，我说：“好吧，让我们得到实际这里最大的群体。”
，然后我做小时。*米，使刚刚返回任意数量的H和M之间的字符。
而且，如果你是刚刚开始，想，“哦，没关系，这将
让我火腿“，它实际上需要一切从H亚伯拉罕·林肯
一路攀升至年底的火腿。
它是贪婪的，它看到小时 - 这一切其他文本 - 米，
这是它的需要。
这是一个特别令人震惊的 - 这是一个功能，我们也可以
为它指定使用其他功能不能贪。
但是，这是我们必须牢记，特别是
看着HTML文本时，这是一个原因，
正则表达式是很难的HTML。
因为如果你有一个HTML的开放标记，然后在中间的东西很多
然后一些其他HTML关闭标签很久以后在节目中，
你刚才吃了不少你的HTML代码中可能的错误。
>> 所有权利 - 让更多的特殊字符，像许多其他语言，
我们逃避使用斜线。
所以我们可以使用点新行指定以外的任何字符。
我们可以使用逃生w来指定任何字母字符。
类推逃生d为任意整数 - 数字字符。
我们可以指定 - 我们可以使用括号来指定相关的表达式。
因此，这将接受A，B，或C。
我们也可以指定或为A或B的选项。
例如 - 如果我们所期待的多种可能性
如在括号中，我们可以使用或操作 -
所以让我们回到这个例子在这里。
现在，就让我们来 - 让我们回到这个例子，然后
AE - 所以这应该返回 - 我想这仍然是亚伯拉罕。
因此，这 - 如果我们这样做 - 伟大。
所以，让我们这里的文字更新。
“亚伯拉罕吃火腿肠，而卷边缝边，而他 - 。”太好了。
所有。太好了。现在，我们得到的火腿，火腿和下摆。
尽管边饰 - 一边哼着他 - 边哼着下摆他。太好了。
同样的事情。
现在，所有仍然只是返回火腿，火腿和下摆的嗡嗡声或他不拿起。
大 - 还等什么，如果我们想看看在任 - 所以我们也可以做
他 - 我们会回来的。
好吧 - 让 - 所有权利 - 位置，你也可以使用插入符号或美元符号
指定你正在寻找的东西在开始或结束的字符串。
或词语的开始或结束。
这是一个使用该方法。
>> 好了 - 所以让我们玩弄一个稍大的文本块。
让我们在这里说此行 - 这一说法在这里。
正则表达式的力量是，他们可以指定图案
不只是固定的字符。
让我们 - 让我们调用该功能块。
然后，我们将读取所有，在。
，然后有一个 - 让我们所有=，那么，有哪些事情是我们可以在这里搜索盈利？
我们可以看看的表达的耳朵。
不是很有趣。怎么样？我们看看会发生什么。
我给它一个问题。
所以任何数量的东西，然后再重新和所有。
所以，应该一切从开始到全部重新也许几次返回。
那么在这里，我们的力量正则表达式是
可以指定图案，这里不仅仅是个字符。
所以最后再一路上涨，最左边的开始和贪婪。
让我们来看看 - 我们还有什么可以期待。
我想一件事，如果你有兴趣寻找代词她和他，
你可以检查是等于0或1
他的表情，那可能是不打算返回 -
哦，我想还给他，因为我们正在寻找电源，那一天，这里的。
让我们试着指定来的东西开始。
让我们看看是否有脱落。
因此，我们可以做的脂肪，那里，我们没有得到任何东西，因为她和他
不发生在这个短语中。
太好了。好了 - 所以这里的猫。
这么复杂的图案伤害大脑。
所以这就是为什么我们使用正则表达式来避免这些问题。
>> 因此，这里有一些其他有用的模式，你可以玩。
我们期待在今天的搜索，但你也可以使用匹配，分割，谓词和团体。
所以，等凉的东西，你可以用正则表达式除了刚刚
寻找模式，采取一个模式，并保持所有的比赛 -
其变量 - 然后在你的代码中使用这些以后。
这可以是相当有帮助的。其他的事情可能会被计数。
因此，我们可以数一数，正则表达式模式的实例，
而这正是我们可以利用组。
模式和其他模式也是可能的。
所以，我只是想谈多一点点的其他方法，你可以使用正则表达式。
>> 因此，一个更先进的应用程序是在模糊匹配。
所以，如果你正在寻找一个文本的表达，凯撒，
您看到盖乌斯·尤利乌斯·凯撒凯撒大帝的名字在其他语言，
那么你可能还需要一些重量分配到这些值。
而如果是足够接近 - 如果超过一定的阈值 - 然后你想
能够接受凯撒大帝。
因此，有一对夫妇，在不同的实现以及其他一些语言。
这里有一些其他的工具，正则表达式的好朋友 - 一个方便的小应用程序在线
检查如果你的正则表达式是由正确。
也有独立的工具，您可以从您的桌面上运行
像超皮克，以及刚刚食谱。
所以，如果你正在做一个项目，涉及一吨的正则表达式
这大概是今天的范围之外的地方去。
然后只给你的感觉是多么常见
在Unix的grep，Perl也有内置，和C有PCRE C.
然后所有这些其他的语言也有正则表达式包
操作基本上是相同的语法，我们得到了今天的味道。
PHP，Java中，红宝石，等等。
>> 谷歌代码搜索实际上是值得一提，它是一个
相对较少的应用程序，允许公众访问
其数据库使用正则表达式。
所以，如果你看一下谷歌代码搜索，你可以找到代码
如果你正在寻找一个实例如何可能会使用一个函数，
发现功能被用在各种不同的情况下，你可以使用正则表达式。
你可以看看fwrite的，然后你可以看看写的国旗或读
如果你想在这种情况下被使用的fwrite的一个例子。
于是同样的事情，在这里，是一些参考。
这将可在网上，所以转发
你想要看的Python中，grep，Perl的 - 你只是想从中得到一些启发
或者，如果你想看看在这里的理论有一些很好的地方起跳。
非常感谢。
[CS50.TV]