正則表達(dá)式簡介
正則表達(dá)式(regular expression,在代碼中常簡寫為regex、regexp或RE),又稱正規(guī)表示式、正規(guī)表示法、正規(guī)運(yùn)算式、規(guī)則運(yùn)算式、常規(guī)表示法,是計(jì)算機(jī)科學(xué)的一個(gè)概念。
正則表達(dá)式使用單個(gè)字符串來描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。
就是用一個(gè)“字符串”來描述一個(gè)特征,然后去驗(yàn)證另一個(gè)“字符串”是否符合這個(gè)特征。比如 表達(dá)式“ab+” 描述的特征是“一個(gè) 'a' 和 任意個(gè) 'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合這個(gè)特征。
正則表達(dá)式的歷史
正則表達(dá)式的“鼻祖”或許可一直追溯到科學(xué)家對人類神經(jīng)系統(tǒng)工作原理的早期研究。
美國新澤西州的Warren McCulloch和出生在美國底特律的Walter Pitts這兩位神經(jīng)生理方面的科學(xué)家,研究出了一種用數(shù)學(xué)方式來描述神經(jīng)網(wǎng)絡(luò)的新方法,他們創(chuàng)造性地將神經(jīng)系統(tǒng)中的神經(jīng)元描述成了小而簡單的自動(dòng)控制元,從而作出了一項(xiàng)偉大的工作革新。
在1951 年,一位名叫Stephen Kleene的數(shù)學(xué)科學(xué)家,他在Warren McCulloch和Walter Pitts早期工作的基礎(chǔ)之上,發(fā)表了一篇題目是《神經(jīng)網(wǎng)事件的表示法》的論文,利用稱之為正則集合的數(shù)學(xué)符號來描述此模型,引入了正則表達(dá)式的概念。正則表達(dá)式被作為用來描述其稱之為“正則集的代數(shù)”的一種表達(dá)式,因而采用了“正則表達(dá)式”這個(gè)術(shù)語。
之后一段時(shí)間,人們發(fā)現(xiàn)可以將這一工作成果應(yīng)用于其他方面。
Ken Thompson就把這一成果應(yīng)用于計(jì)算搜索算法的一些早期研究,Ken Thompson是 Unix的主要發(fā)明人,也就是大名鼎鼎的Unix之父。Unix之父將此符號系統(tǒng)引入編輯器QED,然后是Unix上的編輯器ed,并最終引入grep。Jeffrey Friedl 在其著作《Mastering Regular Expressions (2nd edition)》(中文版譯作:精通正則表達(dá)式,已出到第三版)中對此作了進(jìn)一步闡述講解,如果你希望更多了解正則表達(dá)式理論和歷史,推薦你看看這本書。
自此以后,正則表達(dá)式被廣泛地應(yīng)用到各種UNIX或類似于UNIX的工具中,如大家熟知的Perl。Perl的正則表達(dá)式源自于Henry Spencer編寫的regex,之后已演化成了pcre(Perl兼容正則表達(dá)式Perl Compatible Regular Expressions),pcre是一個(gè)由Philip Hazel開發(fā)的、為很多現(xiàn)代工具所使用的庫。正則表達(dá)式的第一個(gè)實(shí)用應(yīng)用程序即為Unix中的 qed 編輯器。
現(xiàn)在所有的主流操作系統(tǒng)(Linux, Unix,Mac,Windows等)及編程語言(elphi、Scala、PHP、C#、Java、C++、Objective-c、Swift、VB、Javascript、Ruby以及Python等)都支持正則表達(dá)式。
本篇一JavaScript來演示正則表達(dá)式。因?yàn)樽x者可以直接在瀏覽器驗(yàn)證代碼。
正則表達(dá)式的作用
驗(yàn)證字符串是否符合指定特征,比如驗(yàn)證是否是合法的郵件地址。
用來查找字符串,從一個(gè)長的文本中查找符合指定特征的字符串,比查找固定字符串更加靈活方便。
用來替換,比普通的替換更強(qiáng)大。
之所以很多人感覺正則表達(dá)式比較復(fù)雜,一方面是因?yàn)榇蠖鄶?shù)的文檔沒有做到由淺入深地講解,概念上沒有注意先后順序,給讀者的理解帶來困難;另一方面,各種引擎自帶的文檔一般都要介紹它特有的功能,然而這部分特有的功能并不是我們首先要理解的。
參考文章:
https://baike.baidu.com/item/正則表達(dá)式
正則表達(dá)式工作原理https://www.cnblogs.com/aaronjs/archive/2012/06/30/2570800.html
轉(zhuǎn)載本站文章《深入正則表達(dá)式(0):正則表達(dá)式概述》,
請注明出處:https://www.zhoulujun.cn/html/theory/algorithm/IntroductionAlgorithms/8422.html