91丨国产丨白浆秘 喷水,国产熟妇毛多 A片欧美蜜臀,北京熟妇搡BBBB搡BBBB,国产精品人人做人人爽人人添

  您的位置: 【卓安特保-您身邊的護衛(wèi)專家】山東卓安安防工程有限公司,電話13361029977 >> 安防資訊 >> 卓安安防 >> JAVA編程
 閱讀文章

正則表達式(規(guī)則表達式)

  文章作者:網(wǎng)絡(luò)來源:網(wǎng)絡(luò)轉(zhuǎn)摘瀏覽次數(shù):7021字體:字體顏色
 閱讀權(quán)限:游客身份花費會員幣:0添加時間:2020/3/31 22:29:45提交會員:李漠

正則表達式

 
本詞條由“科普中國”科學(xué)百科詞條編寫與應(yīng)用工作項目 審核 。
正則表達式,又稱規(guī)則表達式。(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學(xué)的一個概念。正則表達式通常被用來檢索、替換那些符合某個模式(規(guī)則)的文本。
許多程序設(shè)計語言都支持利用正則表達式進行字符串操作。例如,在Perl中就內(nèi)建了一個功能強大的正則表達式引擎。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和grep)普及開的。正則表達式通?s寫成“regex”,單數(shù)有regexp、regex,復(fù)數(shù)有regexps、regexes、regexen。
中文名
正則表達式
外文名
Regular Expression
別    稱
規(guī)則表達式
代碼簡寫
regex、regexp或RE
行業(yè)歸屬
計算機科學(xué)
作    用
用來檢索、替換那些符合某個模式(規(guī)則)的文本

概念

正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。

簡介

正則表達式是對字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。正則表達式是一種文本模式,該模式描述在搜索文本時要匹配的一個或多個字符串。

起源

正則表達式的“鼻祖”或許可一直追溯到科學(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)元描述成了小而簡單的自動控制元,從而作出了一項偉大的工作革新。
在1951 年,一位名叫Stephen Kleene的數(shù)學(xué)科學(xué)家,他在Warren McCulloch和Walter Pitts早期工作的基礎(chǔ)之上,發(fā)表了一篇題目是《神經(jīng)網(wǎng)事件的表示法》的論文,利用稱之為正則集合的數(shù)學(xué)符號來描述此模型,引入了正則表達式的概念。正則表達式被作為用來描述其稱之為“正則集的代數(shù)”的一種表達式,因而采用了“正則表達式”這個術(shù)語。
之后一段時間,人們發(fā)現(xiàn)可以將這一工作成果應(yīng)用于其他方面。Ken Thompson就把這一成果應(yīng)用于計算搜索算法的一些早期研究,Ken Thompson是 Unix的主要發(fā)明人,也就是大名鼎鼎的Unix之父。Unix之父將此符號系統(tǒng)引入編輯器QED,然后是Unix上的編輯器ed,并最終引入grep。Jeffrey Friedl 在其著作《Mastering Regular Expressions (2nd edition)》(中文版譯作:精通正則表達式,已出到第三版)中對此作了進一步闡述講解,如果你希望更多了解正則表達式理論和歷史,推薦你看看這本書。
自此以后,正則表達式被廣泛地應(yīng)用到各種UNIX或類似于UNIX的工具中,如大家熟知的Perl。Perl的正則表達式源自于Henry Spencer編寫的regex,之后已演化成了pcre(Perl兼容正則表達式Perl Compatible Regular Expressions),pcre是一個由Philip Hazel開發(fā)的、為很多現(xiàn)代工具所使用的庫。正則表達式的第一個實用應(yīng)用程序即為Unix中的 qed 編輯器。
然后,正則表達式在各種計算機語言或各種應(yīng)用領(lǐng)域得到了廣大的應(yīng)用和發(fā)展,演變成為計算機技術(shù)森林中的一只形神美麗且聲音動聽的百靈鳥。
以上是關(guān)于正則表達式的起源和發(fā)展的歷史描述,如今正則表達式在基于文本的編輯器和搜索工具中依然占據(jù)著一個非常重要的地位。
在最近的六十年中,正則表達式逐漸從模糊而深奧的數(shù)學(xué)概念,發(fā)展成為在計算機各類工具和軟件包應(yīng)用中的主要功能。不僅僅眾多UNIX工具支持正則表達式,近二十年來,在WINDOWS的陣營下,正則表達式的思想和應(yīng)用在大部分 Windows 開發(fā)者工具包中得到支持和嵌入應(yīng)用!從正則表達式在Microsoft Visual Basic 6 或 Microsoft VBScript到.NET Framework中的探索和發(fā)展,WINDOWS系列產(chǎn)品對正則表達式的支持發(fā)展到無與倫比的高度,幾乎所有 Microsoft 開發(fā)者和所有.NET語言都可以使用正則表達式。如果你是一位接觸計算機語言的工作者,那么你會在主流操作系統(tǒng)(*nix[Linux, Unix等]、Windows、HP、BeOS等)、主流的開發(fā)語言(delphi、Scala、PHP、C#、Java、C++、Objective-c、Swift、VB、Javascript、Ruby以及Python等)、數(shù)以億萬計的各種應(yīng)用軟件中,都可以看到正則表達式優(yōu)美的舞姿。

目的

給定一個正則表達式和另一個字符串,我們可以達到如下的目的:
1. 給定的字符串是否符合正則表達式的過濾邏輯(稱作“匹配”):
2. 可以通過正則表達式,從字符串中獲取我們想要的特定部分。

特點

正則表達式的特點是:
1. 靈活性、邏輯性和功能性非常強;
2. 可以迅速地用極簡單的方式達到字符串的復(fù)雜控制。
3. 對于剛接觸的人來說,比較晦澀難懂。
由于正則表達式主要應(yīng)用對象是文本,因此它在各種文本編輯器場合都有應(yīng)用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,都可以使用正則表達式來處理文本內(nèi)容。

引擎

正則引擎主要可以分為兩大類:一種是DFA,一種是NFA。這兩種引擎都有了很久的歷史(至今二十多年),當(dāng)中也由這兩種引擎產(chǎn)生了很多變體!于是POSIX的出臺規(guī)避了不必要變體的繼續(xù)產(chǎn)生。這樣一來,主流的正則引擎又分為3類:一、DFA,二、傳統(tǒng)型NFA,三、POSIX NFA。
DFA 引擎在線性時狀態(tài)下執(zhí)行,因為它們不要求回溯(并因此它們永遠不測試相同的字符兩次)。DFA 引擎還可以確保匹配最長的可能的字符串。但是,因為 DFA 引擎只包含有限的狀態(tài),所以它不能匹配具有反向引用的模式;并且因為它不構(gòu)造顯示擴展,所以它不可以捕獲子表達式。
傳統(tǒng)的 NFA 引擎運行所謂的“貪婪的”匹配回溯算法,以指定順序測試正則表達式的所有可能的擴展并接受第一個匹配項。因為傳統(tǒng)的 NFA 構(gòu)造正則表達式的特定擴展以獲得成功的匹配,所以它可以捕獲子表達式匹配和匹配的反向引用。但是,因為傳統(tǒng)的 NFA 回溯,所以它可以訪問完全相同的狀態(tài)多次(如果通過不同的路徑到達該狀態(tài))。因此,在最壞情況下,它的執(zhí)行速度可能非常慢。因為傳統(tǒng)的 NFA 接受它找到的第一個匹配,所以它還可能會導(dǎo)致其他(可能更長)匹配未被發(fā)現(xiàn)。
POSIX NFA 引擎與傳統(tǒng)的 NFA 引擎類似,不同的一點在于:在它們可以確保已找到了可能的最長的匹配之前,它們將繼續(xù)回溯。因此,POSIX NFA 引擎的速度慢于傳統(tǒng)的 NFA 引擎;并且在使用 POSIX NFA 時,您恐怕不會愿意在更改回溯搜索的順序的情況下來支持較短的匹配搜索,而非較長的匹配搜索。
使用DFA引擎的程序主要有:awk,egrep,flex,lex,MySQL,Procmail等;
使用傳統(tǒng)型NFA引擎的程序主要有:GNU Emacs,Java,ergp,less,more,.NET語言,PCRE library,Perl,PHP,Python,Ruby,sed,vi;
使用POSIX NFA引擎的程序主要有:mawk,Mortice Kern Systems’ utilities,GNU Emacs(使用時可以明確指定);
也有使用DFA/NFA混合的引擎:GNU awk,GNU grep/egrep,Tcl。
舉例簡單說明NFA與DFA工作的區(qū)別:
比如有字符串this is yansen’s blog,正則表達式為 /ya(msen|nsen|nsem)/ (不要在乎表達式怎么樣,這里只是為了說明引擎間的工作區(qū)別)。 NFA工作方式如下,先在字符串中查找 y 然后匹配其后是否為 a ,如果是 a 則繼續(xù),查找其后是否為 m 如果不是則匹配其后是否為 n (此時淘汰msen選擇支)。然后繼續(xù)看其后是否依次為 s,e,接著測試是否為 n ,是 n 則匹配成功,不是則測試是否為 m 。為什么是 m ?因為 NFA 工作方式是以正則表達式為標(biāo)準(zhǔn),反復(fù)測試字符串,這樣同樣一個字符串有可能被反復(fù)測試了很多次!
而DFA則不是如此,DFA會從 this 中 t 開始依次查找 y,定位到 y ,已知其后為a,則查看表達式是否有 a ,此處正好有a 。然后字符串a(chǎn) 后為n ,DFA依次測試表達式,此時 msen 不符合要求淘汰。nsen 和 nsem 符合要求,然后DFA依次檢查字符串,檢測到sen 中的 n 時只有nsen 分支符合,則匹配成功!
由此可以看出來,兩種引擎的工作方式完全不同,一個(NFA)以表達式為主導(dǎo),一個(DFA)以文本為主導(dǎo)!一般而論,DFA引擎則搜索更快一些!但是NFA以表達式為主導(dǎo),反而更容易操縱,因此一般程序員更偏愛NFA引擎! 兩種引擎各有所長,而真正的引用則取決與你的需要以及所使用的語言。

符號

(摘自《正則表達式之道》)
正則表達式由一些普通字符和一些元字符(metacharacters)組成。普通字符包括大小寫的字母和數(shù)字,而元字符則具有特殊的含義,我們下面會給予解釋。
在最簡單的情況下,一個正則表達式看上去就是一個普通的查找串。例如,正則表達式"testing"中沒有包含任何元字符,它可以匹配"testing"和"testing123"等字符串,但是不能匹配"Testing"。

要想真正的用好正則表達式,正確的理解元字符是最重要的事情。下表列出了所有的元字符和對它們的一個簡短的描述。

最簡單的元字符是點,它能夠匹配任何單個字符(注意不包括換行符)。假定有個文件test.txt包含以下幾行內(nèi)容:
he is arat
he is in a rut
the food is Rotten
I like root beer
我們可以使用grep命令來測試我們的正則表達式,grep命令使用正則表達式去嘗試匹配指定文件的每一行,并將至少有一處匹配表達式的所有行顯示出來。命令
grep r.t test.txt
在test.txt文件中的每一行中搜索正則表達式r.t,并打印輸出匹配的行。正則表達式r.t匹配一個r接著任何一個字符再接著一個t。所以它將匹配文件中的rat和rut,而不能匹配Rotten中的Rot,因為正則表達式是大小寫敏感的。要想同時匹配大寫和小寫字母,應(yīng)該使用字符區(qū)間元字符(方括號)。正則表達式[Rr]能夠同時匹配R和r。所以,要想匹配一個大寫或者小寫的r接著任何一個字符再接著一個t就要使用這個表達式:[Rr].t。
要想匹配行首的字符要使用抑揚字符(^)——有時也被叫做插入符。例如,想找到text.txt中行首"he"打頭的行,你可能會先用簡單表達式he,但是這會匹配第三行的the,所以要使用正則表達式^he,它只匹配在行首出現(xiàn)的he。
有時候指定“除了×××都匹配”會比較容易達到目的,當(dāng)抑揚字符(^)出方括號中時,它表示“排除”,例如要匹配he ,但是排除前面是t or s的情形(也就是the和she),可以使用:[^st]he。
可以使用方括號來指定多個字符區(qū)間。例如正則表達式[A-Za-z]匹配任何字母,包括大寫和小寫的;正則表達式[A-Za-z][A-Za-z]* 匹配一個字母后面接著0或者多個字母(大寫或者小寫)。當(dāng)然我們也可以用元字符+做到同樣的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*完全等價。但是要注意元字符+ 并不是所有支持正則表達式的程序都支持的。關(guān)于這一點可以參考后面的正則表達式語法支持情況。
要指定特定數(shù)量的匹配,要使用大括號(注意并不是所有擴展正則表達式的實現(xiàn)都支持大括號。此外,根據(jù)具體的實現(xiàn),您可能需要先使用反斜杠對其進行轉(zhuǎn)義。)。想匹配所有10和100的實例而排除1和 1000,可以使用:10\{1,2\} 或 10{1, 2},這個正則表達式匹配數(shù)字1后面跟著1或者2個0的模式。在這個元字符的使用中一個有用的變化是忽略第二個數(shù)字,例如正則表達式0\{3,\} 或 0{3,} 將匹配至少3個連續(xù)的0。
正是指出一個使用正則表達式常見錯誤的最佳時機。為什么我們要使用[^,]*這樣的一個表達式,而不是更加簡單直接的寫法,例如:.*,來匹配第一個參數(shù)呢?設(shè)想我們使用模式.*來匹配字符串"10,7,2",它應(yīng)該匹配"10,"還是"10,7,"?為了解決這個兩義性(ambiguity),正則表達式規(guī)定一律按照最長的串來,在上面的例子中就是"10,7,",顯然這樣就找出了兩個參數(shù)而不是我們期望的一個。所以,我們要使用[^,]*來強制取出第一個逗號之前的部分。
正是指出一個使用正則表達式常見錯誤的最佳時機。為什么我們要使用[^,]*這樣的一個表達式,而不是更加簡單直接的寫法,例如:.*,來匹配第一個參數(shù)呢?設(shè)想我們使用模式.*來匹配字符串"10,7,2",它應(yīng)該匹配"10,"還是"10,7,"?為了解決這個兩義性(ambiguity),正則表達式規(guī)定一律按照最長的串來,在上面的例子中就是"10,7,",顯然這樣就找出了兩個參數(shù)而不是我們期望的一個。所以,我們要使用[^,]*來強制取出第一個逗號之前的部分。

 

這個表達式我們已經(jīng)分析到了:foo\(([^,]*),這一段可以簡單的翻譯為“當(dāng)你找到foo(就把其后直到第一個逗號之前的部分標(biāo)記為\1”。然后我們使用同樣的辦法標(biāo)記第二個參數(shù)為\2。對第三個參數(shù)的標(biāo)記方法也是一樣,只是我們要搜索所有的字符直到右括號。我們并沒有必要去搜索第三個參數(shù),因為我們不需要調(diào)整它的位置,但是這樣的模式能夠保證我們只去替換那些有三個參數(shù)的foo()方法調(diào)用,在foo()是一個重載(overloading)方法時這種明確的模式往往是比較保險的。然后,在替換部分,我們找到foo()的對應(yīng)實例,然后利用標(biāo)記好的部分進行替換,是把第一和第二個參數(shù)交換位置。

 

零寬斷言

編輯
用于查找在某些內(nèi)容(但并不包括這些內(nèi)容)之前或之后的東西,也就是說它們像\b,^,$那樣用于指定一個位置,這個位置應(yīng)該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:
(?=exp)也叫零寬度正預(yù)測先行斷言,它斷言自身出現(xiàn)的位置的后面能匹配表達式exp。比如\b\w+(?=ing\b),匹配以ing結(jié)尾的單詞的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.時,它會匹配sing和danc。
(?<=exp)也叫零寬度正回顧后發(fā)斷言,它斷言自身出現(xiàn)的位置的前面能匹配表達式exp。比如(?<=\bre)\w+\b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。
假如你想要給一個很長的數(shù)字中每三位間加一個逗號(當(dāng)然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?<=\D)\D{3})+\b,用它對xxxxxxxxxx進行查找時結(jié)果是xxxxxxxxx
下面這個例子同時使用了這兩種斷言:(?<=\s)\d+(?=\s)匹配以空白符間隔的數(shù)字(再次強調(diào),不包括這些空白符)
斷言用來聲明一個應(yīng)該為真的事實。正則表達式中只有當(dāng)斷言為真時才會繼續(xù)進行匹配。

 

 

負向零寬

編輯
如果我們只是想要確保某個字符沒有出現(xiàn),但并不想去匹配它時怎么辦?例如,如果我們想查找這樣的單詞--它里面出現(xiàn)了字母q,但是q后面跟的不是字母u,我們可以嘗試這樣:
\b\w*q[^u]\w*\b匹配包含后面不是字母u的字母q的單詞。但是如果多做測試(或者你思維足夠敏銳,直接就觀察出來了),你會發(fā)現(xiàn),如果q出現(xiàn)在單詞的結(jié)尾的話,像Iraq,Benq,這個表達式就會出錯。這是因為[^u]總要匹配一個字符,所以如果q是單詞的最后一個字符的話,后面的[^u]將會匹配q后面的單詞分隔符(可能是空格,或者是句號或其它的什么),后面的\w*\b將會匹配下一個單詞,于是\b\w*q[^u]\w*\b就能匹配整個Iraq fighting。負向零寬斷言能解決這樣的問題,因為它只匹配一個位置,并不消費任何字符。,我們可以這樣來解決這個問題:\b\w*q(?!u)\w*\b。
零寬度負預(yù)測先行斷言(?!exp),斷言此位置的后面不能匹配表達式exp。例如:\d{3}(?!\d)匹配三位數(shù)字,而且這三位數(shù)字的后面不能是數(shù)字;\b((?!abc)\w)+\b匹配不包含連續(xù)字符串a(chǎn)bc的單詞。
同理,我們可以用(?<!exp),零寬度負回顧后發(fā)斷言來斷言此位置的前面不能匹配表達式exp:(?<![a-z])\d{7}匹配前面不是小寫字母的七位數(shù)字。
請詳細分析表達式(?<=<(\w+)>).*(?=<\/\1>),這個表達式最能表現(xiàn)零寬斷言的真正用途。
一個更復(fù)雜的例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標(biāo)簽內(nèi)里的內(nèi)容。(?<=<(\w+)>)指定了這樣的前綴:被尖括號括起來的單詞(比如可能是<b>),然后是.*(任意的字符串),最后是一個后綴(?=<\/\1>)。注意后綴里的\/,它用到了前面提過的字符轉(zhuǎn)義,將”/“轉(zhuǎn)義;\1則是一個反向引用,引用的正是捕獲的第一組,前面的(\w+)匹配的內(nèi)容,這樣如果前綴實際上是<b>的話,后綴就是</b>了。整個表達式匹配的是<b>和</b>之間的內(nèi)容(再次提醒,不包括前綴和后綴本身)。

 

 

·上篇文章:ultraiso制作u盤啟動盤教程圖文詳解
·下篇文章:Java 循環(huán)結(jié)構(gòu)
復(fù)制 】 【 打印
 相關(guān)文章
沒有相關(guān)文章
特別聲明:本站除部分特別聲明禁止轉(zhuǎn)載的專稿外的其他文章可以自由轉(zhuǎn)載,但請務(wù)必注明出處和原始作者。文章版權(quán)歸文章原始作者所有。對于被本站轉(zhuǎn)載文章的個人和網(wǎng)站,我們表示深深的謝意。如果本站轉(zhuǎn)載的文章有版權(quán)問題請聯(lián)系我們,我們盡快予以更正,謝謝。
關(guān)于我們 | 業(yè)務(wù)范圍 | 免責(zé)聲明 | 聯(lián)系我們 | 友情連接
版權(quán)所有 Copyright © 2007 【卓安特保-您身邊的護衛(wèi)專家】山東卓安安防工程有限公司,電話13361029977 All Rights Reserved.
魯ICP備11024361號-5    頁面執(zhí)行時間:15.63MS
狠狠躁日日躁夜夜躁A片视频小说 | 懂色av蜜臀av绯色av蜜乳 | 亚洲中文字幕旧里番在线免费视频 | 17c在线偷拍在线观看 | 少妇把腿扒开让我添69式mv | 久久红桃A在线观看 | av高清无码在线观看 | 国产成人V在线精品一区 | 人妻少妇无码精品视频区 | EEUSS鲁丝片一区二区三区在线看 | 精品人妻一区二区三区国产麻豆 | 西西大胆无码视频 | 少妇疯狂做爰XXXⅩ高潮网站 | 抽搐一进一出一级A片18禁 | 亚洲一区二区三区久久 | 亚洲精品国产精品乱码不卡√香蕉 | 亚洲国产AV一区二区三区精品 | 人妻体内射精一区二区三区 | 亚洲AV成人一区二区电影在线 | ,亚洲人成毛片在线播放 | 91国精产品秘 天美一区 | 国产棈品久久嫩一区 | 无码少妇一级A片在线观看 91 在线丝袜播放动漫 | 91人人爽人人爽人人精88 | 无码午夜人妻一区二区不卡视频 | 国产特黄aaaaa毛片 | 亚洲AV成人片无码好多水 | 无码人妻精品一区二区蜜桃91 | 媚黑极品魔都绿帽人妻找黑人 | 国产乱人乱偷精品视频a人人澡下载 | 精品人妻中文字幕 | 精品成人一区二区三区久久精品 | 国产成人高清无码 | 国产成人1区2区3区4区最新免费 | 国产成人精品 视频 | 国产美女裸露无遮挡双奶A片视频 | 亚洲AV无码一区二区三区在线 | 最近中文字幕mv | 91嫖妓站街老熟女 | 中文字幕XxXXxX | 国产又爽 又黄 免费视频两年半 |