tch*_*ist 29
正则表达式是声明性编程的一种形式.如果您习惯于命令式,功能性或面向对象编程,那么它们就是一种非常不同的思维方式.这是一种基于规则的方法,具有微妙的回溯问题.我敢说Prolog的背景可能实际上对你有好处,这当然不是我通常建议的.
通常我会让人们grep从他们的shell中使用命令,然后使用正则表达式在编辑器中进行搜索和替换.
但我猜你是不是从一个Unix背景的,因为如果你是,你会遍布遇到的正则表达式,从最最基本的grep命令,在模式匹配vi或emacs编辑.您可以grep通过键入来查看联机帮助页
% man grep
Run Code Online (Sandbox Code Playgroud)
在您的BSD, Linux, Apple或Sun系统上 - 仅举几例.
☹ ¡ʇɟoƨoɹɔᴉƜʇnoqɐəɯʞƨɐʇUOPəƨɐəldʇƨnɾ ☹
如果你在学校或大学遇到常规表达,那可能是在自动机理论的背景下.他们在讨论常规语言时会出现.如果你经历过这样的课程,你可能还记得正则表达式是凌乱的有限自动机的用户友好面孔.他们可能并没有教你,但是,是象牙塔里的那个之外,正则表达式中,人们实际上在稀薄的,理论性的高度使用在现实世界中是远远落后的"常规" 不规则那种平常的话语.这意味着现代正则表达式 - 如果您愿意,可以将它们称为模式 - 可以比计算机科学课程中传授的传统正则表达式做得更多.在课堂外的现代正则表达中没有任何常规,但这是一件好事.
我说"现代",但实际上正则表达式并不规律,因为Ken Thompson首先将参考文献放回到他的回溯NFA中,当时他很有名,证明了NFA-DFA的等效性.因此,除非您实际使用的是DFA引擎,否则最好不要忘记任何有关正则表达式正则性的书籍学习.它不适用于我们在现实世界中每天真正使用它们的方式.
现代正则表达式不仅仅支持返回引用,一旦你深入研究它们就会发现.他们是他们自己的奇妙世界,即使这个世界有时候有点超现实.它们可以让您只用一行代替页面和代码页.他们也会让你因为疯狂的行为而失去头发.有时候它们会使你的计算机看起来像是挂起的,因为它实际上在它与宇宙的热量死亡之间的竞争中非常努力,在一些可怕的O(2ⁿ)算法中,甚至更糟.实际上,它可能很容易变得更糟.这就是掌握这种力量所能做到的事情.没有训练轮或慢车道.正则表达式是卓越的强大工具.
在我给你一大堆有用的参考资料之前,还有一件事.正如我今天在其他地方已经说过的那样,正则表达式不一定是丑陋的,它们也不一定很难.记住:如果你创造丑陋的正则表达式,它只是对你的反映,而不是它们.
这绝对没有理由创建难以阅读的正则表达式.哦,那里有很多这样的东西,但它们不应该是,它们不一定是.即使正则表达式(在很大程度上(一种声明性编程形式,在其他形式的编程中使用的所有软件工程技术仍然适用于此处!
正则表达式永远不应该像一串密集的标点符号,这是不可能破译的.如果您删除了所有字母标识符,删除了所有空格和缩进,删除了所有注释,并删除了自上而下编程的每一个跟踪,那么任何语言都将是一场灾难.所以当然,如果你这样做,它们看起来就像cr @ p.不要那样做!
因此,无论何时创建正则表达式,都要使用所有这些基本工具,包括美观的代码布局,仔细的问题分解,命名子例程,将声明与执行(包括排序!),单元测试以及所有其余部分解耦.这些都是使您的模式可维护的关键步骤 .
这是写一件事/(.)\1/,但写一些像是另一回事m?????™?¶???#???.那些是来自黑暗时代的正则表达:不要只是拒绝它们:在火刑柱上燃烧它们!毕竟,它的编程不是线路噪音或高尔夫!
关于正则表达式的维基百科页面是一个足够好的概述.
IBM 在他们的Speaking Unix系列中对正则表达式进行了很好的介绍.
Russ Cox有一个很好的经典正则表达式参考列表.您可能想要查看原始版本8正则表达式,这可以在Perl联机帮助页中找到,但这些是原始的,最基本的模式,每个人都是在过去的日子里长大的.
Jan Goyvaerts的regular-expressions.info网站和他的正则表达手册,也来自O'Reilly.
我是Perl的母语人士,所以让我说四个字.Perl Cookbook的第5章和Perl 编程的第6章,有些令人尴尬的是你们真的 和alios,也来自O'Reilly,都致力于Perl中的正则表达式.Perl是源自现代正则表达式中发现的大多数正则表达式功能的语言,并且它继续领先.与其他语言相比,Perl对正则表达式的Unicode支持特别丰富且使用起来非常简单.您可以从O'Reilly网站下载这两本书中的所有代码示例,或者查看下一项.该perldoc.org网站对模式匹配相当多,包括perlre和perluniprops manpages,只是为了取几个起点.
在Perl Cookbook中,PLEAC项目以令人眼花缭乱的多种语言重新实现了Perl Cookbook代码,包括ada,常见的lisp,groovy,guile,haskell,java,merd,ocaml,php,pike,python,rexx,ruby,和tcl.如果你看一下每种语言对于PCB的正则表达式章节的作用,你将会学到很多关于该语言如何处理正则表达式的知识.这是一个了不起的资源,令人大开眼界,即使有些解决方案是sup,也不是最优秀的.
来自Apress的Mehran Habibi的 Java正则表达式.通过阅读关于Pattern类的Sun文档,这肯定比想要解决任何问题更好.Java可能是学习正则表达式的最糟糕的语言; 它非常笨拙而且经常是完全愚蠢的.我说的是痛苦的个人经历,而不是无知,我在这个评估中并不孤单.如果必须使用JVM语言,我建议使用 Groovy或者 Scala.不幸的是,两者都基于标准的Java模式匹配类,因此分享它们的不足之处.
如果您需要Unicode而您使用的是Java或C⁺⁺而不是Perl,那么我建议您查看ICU库.他们在Java中使用Java处理Unicode要比Sun更好,但是对于我的口味来说它仍然感觉像汇编程序一样.Perl和Java似乎对Unicode和多种编码具有最佳支持.Java仍然有点肮脏,但其他语言往往更糟糕.请注意,在网站上使用正则表达式拼写的语言总是比使用它们的语言更加笨拙.
如果您正在使用C,那么我可能会跳过系统提供的正则表达式库并跳转到Phil Hazel的PCRE.奖励是可以构建PCRE 以合理地处理Unicode.它也是其他几种语言和工具使用的基本正则表达式库,包括PHP.
| 归档时间: |
|
| 查看次数: |
1581 次 |
| 最近记录: |