[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]