聊聊正则表达式

对从来没接触过正则表达式来说的新手,可能乍一听有点懵,这是什么鬼?

我先说说这玩意儿能干什么吧。

正则表达式的作用

正则表达式的主要作用就是字符串匹配。

有人会说,又玩概念,我还以为这玩意儿有多高端,字符串匹配有什么新鲜的?string的Contains(C#)或find(Python等)函数不就解决了?

非也非也。Contains是完全匹配,比如你想在一段文字中查有没有"中国人"这三个字,那用Contains没问题。但是其实很多情况下我们不仅需要“中国人”,“中国南方人”、“中国北方人”也应该需要。如果用Contains的方式,那就只能不断增加判断条件,可是你总归是很难穷举出来的,比如“中国男人”、“中国女人”,“中国北京人”,“中国上海人”,“中国南方上海女人”等等,总之,你是没办法用把所有情况都穷举出来的,这就是完全匹配的局限性。

比如下图。

只能匹配一个

正则表达式能够实现通配符匹配,比如上面“中国人”的例子。使用正则表达式就可以查找到所有开头是“中国”,结尾是“人”的字符串,不管你中间是什么。

看了上图,你就应该能明白了正则表达式的作用了吧?一个表达式可以匹配多个不同的结果,灵魂就在于通配符。从某种程度上讲,让程序能够一定程度的适应未知,具备了联想的功能。

有了这种功能,它的应用场景就包含但不限于:低端的如输入验证、数据采集、语法检测等,高端的如编译器、人工智能等。


为什么叫正则表达式

正则表达式的英文:Regular Expression。至于为啥是正则表达式,而不是规则表达式、规范表达式,我想可能是源自于数学吧,数学里面有正则集(Regular Set)的概念,但这个是干什么的我搞不懂。总之这是一个大家约定成俗的叫法,你理解就好。


起源与发展

20世纪40年代:正则表达式最初的想法来自两位神经学家:沃尔特·皮茨与麦卡洛克,他们研究出了一种用数学方式来描述神经网络的模型。

1956年:一位名叫Stephen Kleene的数学科学家发表了一篇题目是《神经网事件的表示法》的论文,利用称之为正则集合的数学符号来描述此模型,引入了正则表达式的概念。正则表达式被作为用来描述其称之为“正则集的代数”的一种表达式,因而采用了“正则表达式”这个术语。

1968年:C语言之父、UNIX之父肯·汤普森把这个“正则表达式”的理论成果用于做一些搜索算法的研究,他描述了一种正则表达式的编译器,于是出现了应该算是最早的正则表达式的编译器qed(这也就成为后来的grep编辑器)。

Unix使用正则之后,正则表达式不断的发展壮大,然后大规模应用于各种领域,根据这些领域各自的条件需要,又发展出了许多版本的正则表达式,出现了许多的分支。我们把这些分支叫做“流派”。

1987年:Perl语言诞生了,它综合了其他的语言,用正则表达式作为基础,开创了一个新的流派,Perl流派。之后很多编程语言如:Python、Java、Ruby、.Net、PHP等等在设计正则式支持的时候都参考Perl正则表达式。

这也是为什么我们今天看到大部分编程语言的正则表达式语法都基本一样,因为他们都出自Perl。

如今Perl语言已经没落到编程语言的末端,但它却为正则表达式的语法统一奠定了基础。


学习难度

里面的算法有点复杂,但是那些大牛们早就把这些算法都封装好了,作为我们应用开发者来说,只要会写表达式就OK了。

有编程基础,不用半天就基本可以掌握了。

展开阅读全文

页面更新:2024-04-21

标签:穷举   正则   编译器   表达式   流派   字符串   中国   算法   语言   数学

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top