正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在不少文本編輯器裏,正則表達式一般被用來檢索、替換那些符合某個模式的文本。因爲正則表達式主要應用對象是文本,所以它在各類文本編輯器場合都有應用,小到著名編輯器EditPlus,大到Microsoft Word、Visual Studio等大型編輯器,均可以使用正則表達式來處理文本內容。(PS:初學者通常都認爲正則表達式很是抓狂的!理解,你會發現他的強大!)java
一、給定的字符串是否符合正則表達式的過濾邏輯(稱做「匹配」);
二、能夠經過正則表達式,從字符串中獲取咱們想要的特定部分。linux
一、靈活性、邏輯性和功能性很是的強;
二、能夠迅速地用極簡單的方式達到字符串的複雜控制。
三、對於剛接觸的人來講,比較晦澀難懂。android
一、正則表達式在線驗證工具推薦regexpal
web
Regexpal是一個基於Javascript的在線正則表達式驗證工具,上面的輸入框中,是讓咱們輸入正則表達式(匹配規則),下面的輸入框則是讓咱們輸入待匹配的數據。此外,根據具體要求,還能夠設置忽略大小寫、多行匹配等參數。正則表達式
二、本地安裝工具推薦 regexbuddy3vim
RegexBuddy一款正則表達式編輯工具,幫助你的編寫須要的正則表達式,還可使用它理解別人編寫的表達式。編輯器
三、學習裝逼的工具regexrsvg
不解釋,本身Google吧。工具
工具使用很少解釋,這都是小兒科工具,碼農均可以本身搞定的。接下來繼續帶你裝逼帶你飛。性能
原始字符串:」yanbo」
正則表達式:」yanbo」
如上就是最簡單最直接的字面匹配字符串,屬於最簡單的正則表達式。
正則表達式: 「\d」 或者 「[0-9]」 或者 「[0123456789]」
原始字符串:」3」
如上三個正則表達式的匹配效果是同樣的,都是匹配指定字串中的一個0-9的數字,只是匹配一個數字。三種寫法各有優點,」\d」能夠表示任意數字,」[m-n]」能夠表示m-n的一位數字,」[abcd]」能夠匹配指定的abcd中的一個數字。特別的認爲」[0123456789]」匹配的是」0123456789」字符串是錯誤的想法,特別留意,匹配的是一位!!!還能夠以下:
正則表達式:」[015-7]」
可匹配的數字:0,1,5,6,7
正則表達式:」\D」 或者 「[^0-9]」 或者 「[^\d]」
匹配字串:非數字字符(切記:也是匹配一個字符)。
如上三個正則表達式的匹配效果是同樣的,都是匹配一個非數字字符。」[]」中的」^」就是取反,除去」^」
後面的內容。
首先強調一點,匹配的是單詞和非單詞的字符,不是單詞!!!
「\w」 這個簡寫式將匹配全部單詞字符(字母、數字、下劃線)。
「\D」 匹配非數字字符,包含空格、標點(引號、連字符、反斜槓、方括弧)等字符。
在英語環境下 「\w」 與 「[_a-z0-9A-Z]」 匹配相同的單詞字符。
「\W」 匹配非單詞字符(空格、標點及其餘非字母、數字字符等)。
在英語環境下 「\W」 與 「[^_a-z0-9A-Z]」 匹配相同的單詞字符。
以下提供更多的字符簡寫式,不過要注意!!!!不是全部的正則表達式處理器能夠識別如下簡寫式。
字符簡寫式 | 描述 |
---|---|
\a | 報警符 |
[\b] | 退格字符 |
\c x | 控制字符 |
\d | 數字符 |
\D | 非數字符 |
\w | 單詞字符 |
\W | 非單詞字符 |
\0 | 空字符 |
\x xx | 字符的十六進制值 |
\u xxx | 字符的Unicode值 |
正則表達式:」\s」 或者 「[ \t\n\r]」
匹配結果: 空白符(空格、製表符、換行符、回車符)
如上 「[ \t\n\r]」 的 「\t\n\r」 前至少有一個空格,不然無效。
正則表達式:」\S」 或者 「[^\s]」 或者 「[^ \t\n\r]」
匹配結果: 非空白符(除空格、製表符、換行符、回車符之外的字符)。
除過 「\s」 匹配的字符以外還有以下一些不太常見的空白符:
字符簡寫式 | 描述 |
---|---|
\s | 空白符 |
\S | 非空白符 |
\f | 換頁符 |
\h | 水平空白符 |
\H | 非水平空白符 |
\n | 換行符 |
\r | 回車符 |
\t | 水平製表符 |
\v | 垂直製表符 |
\V | 非垂直製表符 |
「.」 匹配除過行結束符之外的全部字符,個別狀況除外。
正則表達式:」\b\w\w\w\b」
匹配字符串:三個字符的單詞
如上表達式中」\b」簡寫式匹配單詞邊界,不消耗任何字符,通常兩個邊界都寫。以下例子是」.」的特例。
正則表達式: 「a.c.」
匹配字符串:axc.
如上匹配的是axc. 其中x能夠是任意字符,而最後 . 就是轉義字符而不是 . 。
學習了一些入門級的正則表達式之後咱們就來裝裝逼,裝逼也要裝的有逼格,因此如上第一章的工具就太簡單了,咱們用Linux的sed流編輯器來裝逼。(PS:不瞭解Linux的sed流編輯器的請本身google或者度娘)。
這裏演示一個將字符串」This is YanBo’s Blog!」以Html二級標題輸出的例子。
sed編輯器命令:
echo "This is YanBo's Blog!" | sed 's/^/<h2>/;s/$/<\/h2>/p;q'
如上命令在linux終端執行以後以下:
一、echo打印」This is YanBo’s Blog!」到屏幕,而後經過」|」管道將輸出做爲sed的輸入。
二、sed默認操做是直接複製每行輸入並輸出。
三、s/^/<h2>/
在行的開頭(^)添加HTML的二級標題<h2>
標籤。
四、分號(;)用於分割命令。
五、s/$/<\/h2>/
用於在結尾($)添加HTML二級標題</h2>
標籤。
六、命令p打印受影響的一行。
七、命令q結束sed程序。
這一部分咱們學習正則表達式的基礎匹配,算是入門技能。接下來繼續帶你裝逼帶你飛。
很少BB,邊界這部分算是正則表達式的核心之一。斷言(零寬度斷言)這一詞足矣。
斷言(零寬度斷言)標記邊界,並不耗費字符,不匹配字符,匹配字符串中的位置。
「^」 匹配行或者字符串的起始位置,或者整個文檔的起始位置。
「$」 匹配行或者字符串結尾位置。
例子:
正則表達式: 「^word$」
匹配字符串: word(僅有該單詞的字符串,w開頭,d結束)。
「\bxxx\b」 匹配單詞邊界。
「\b」 是一個零寬度斷言,表面上它會匹配空格或者行起始,實際上它匹配的是一個零寬度不存在的東西。
「\B」 是一個匹配非單詞邊界,匹配除單詞以外的位置。
例子:
正則表達式: 「\Ba\B」
匹配字符串: 「fhrrhahhr」(相似這樣的a兩邊不是單詞邊界的字符,這裏匹配字符a)。
「\A」 與」^」類似,該錨位符匹配主題詞的開始。這個寫法不是在全部的正則表達式程序中均可以使用的,可是能夠在Perl和PCRE中使用,要匹配主題詞的結尾用」\Z」, 某些上下文中還能夠用」\z」。
例子:
正則表達式:」\Aaaaa\Z」
匹配字串:」aaaa」 (僅僅aaaa開頭結尾的字符串,也即主題詞開始結束)
能夠用」\Q」和」\E」之間的字符集匹配字符串字面值。」.^$*+?|(){}[]-「這15個元字符在正則表達式中有特殊含義,用來編寫匹配模式。其中的連字符」-「在正則表達式的方括號中用來表示範圍,其餘狀況下無特殊含義。你在正則表達式中直接輸入這些字符不會顯示,若是想顯示這些字符自己你就須要把他放在」\Q」和」\E」之間,固然,也能夠在其前面加」\」便可。
例子:
正則表達式: 「\Q$\E」 或者 「$」
匹配字符: $字符自己
繼續像上一節同樣裝逼,繼續添加標籤,繼續使用linux的sed命令BB。sed中的命令(i)容許你在文件或者字符串中的某個位子以前插入文本,與(i)相反的命令是(a),他是在某個位置以後添加文本。關於sed(或者grep或者vi與vim)的實戰正則表達式例子這裏不給出,自行google嘗試,這裏重在講解正則表達式。
學習了邊界與斷言(零寬度斷言)。沒啥總結的,開始正則表達式的精華,繼續BB。
選擇操做能夠在多個可選模式中匹配一個。譬如你想在」The android developer need fix bug on the Bug System.」中找出」the」(the, The, THE)出現過多少次,這時候就使用選擇模式。
正則表達式:」(the|The|THe|THE|tHE|thE|ThE|tHe)」 或者 「(?i)the」
原始字符串:」The android developer need fix bug on the Bug System.」
匹配結果: The,the
如上正則表達式匹配全部大小寫的the。
如下是其餘各類選項和修飾符(注意:以下選項不實用全部正則表達式的平臺):
選項 | 描述 | 支持平臺 |
---|---|---|
(?d) | unix中的行 | java |
(?i) | 不區分大小寫 | PCRE、Perl、Java |
(?J) | 容許重複的名字 | PCRE |
(?m) | 多行 | PCRE、Perl、Java |
(?s) | 單行 | (dotall) PCRE、Perl、Java |
(?u) | Unicode | java |
(?U) | 默認最短匹配 | PCRE |
(?x) | 忽略空格和註釋 | PCRE、Perl、Java |
(?-…) | 復原或者關閉選項 | PCRE |
子模式是正則表達式分組中的一個或者多個分組,就是模式中的模式。多數狀況,子模式中的條件能獲得匹配的前提是前面的模式獲得匹配,可是也有例外(譬如」(the|THE|The)」匹配THE不依賴於the,由於the會先去匹配,這個例子有三個子模式,分別是the、THE、The),子摸式寫法不少種,這裏只關注括弧中的子模式。
例子(子模式匹配依賴於前面的模式):
正則表達式:(t|T)h(e|E)
匹配:the、The、thE、ThE
上面例子中第二個子模式」(e|E)」依賴於第一個子模式」(t|T)」。
特別的,括弧對於子模式不是必須的!!!!!以下:
正則表達式:」\b[tT]h[eE]」
匹配:the、The、thE、ThE
以上」[tT]」字符組能夠看做第一個子模式,同理第二個。
當一個模式的所有或者部份內容由一對括號分組時,他就對內容進行捕獲並臨時存儲於內存中,能夠經過後向引用重用捕獲的內容,形式以下:
「\1」 、」\2」 或者 「1"、「1」、"2」,捕獲的n個分組。
在sed命令中只接受」\1」這種分組。
例子(使用linux的sed命令模擬後向引用):
echo 「YanBo is an Android Developer!」 | sed -En ‘s/(YanBo is) (an Android Developer)/\2 \1/p’
輸出:an Android Developer YanBo is!
解釋:
-E 是sed調運ERE(擴展正則表達式),所以,括號能夠看成字面值來使用。
-n 覆蓋打印每一行的默認設置。
捕獲分組1,2進行替換。
命名分組就是有名字的分組。由此能夠經過名字引用分組而不是數字。
命名分組語法:
語法 | 描述 |
---|---|
(?…) | 命名分組 |
(?name…) | 另外一種命名分組方式 |
(?P…) | Python中的命名分組 |
\k | 在Perl中引用分組名 |
\k’name’ | 在Perl中引用分組名 |
\g{name} | 在Perl中引用分組名 |
\k{name} | 在.NET中引用分組名 |
(?P=name) | 在Python中引用分組名 |
非捕獲分組不會將其內容存儲在內存中。在你並不想引用分組時可使用它。因爲不存儲分組,因此非捕獲分組性能較高。
例子:
捕獲分組的寫法:」(the|THE|The)」
不須要任何後向引用能夠寫爲:」(?:the|The|THE)」
不區分大小寫:」(?i)(?:the)」 或者 「(?😦?i)the)」 或者(推薦)」(?i:the)」
還有一種非捕獲分組時原子分組。若是你用正則表達式引擎進行回朔操做,這種分組能夠關閉回朔操做,可是他只爭對原子分組部分,而不是整個表達式。語法以下:
「(?>the)」
正則表達式慢的一個緣由就是回朔操做。
沒啥總結的,繼續裝逼繼續飛,下面的逼格更高更嗨!!!
量詞原本是貪心的。貪心量詞首先會匹配整個字串,而後一個一個回退(回朔),直到找到匹配的爲止。因此他最消耗資源。
懶惰的量詞使用另外一種策略,他從目標的起始位置開始尋找匹配,每次檢查一個字符,最後嘗試匹配整個字符串。想要量詞變爲懶惰的,必須在普通量詞後添加一個問號(?)。
佔有量詞會覆蓋整個目標而後嘗試尋找匹配內容,可是隻嘗試一次,不會回朔。佔有量詞是在普通量詞以後添加一個加號(+)。
以下基本量詞默認都是貪心的。
語法 | 描述 |
---|---|
? | 零個或者一個 |
+ | 一個或者多個 |
* | 零個或者多個 |
例如:
正則表達式:」9+」
匹配:一個或者多個9
以下花括弧量詞是匹配最精確的量詞,默認也是貪心的。
語法 | 描述 |
---|---|
{n} | 精確匹配n次 |
{n,} | 匹配n或者更屢次 |
{m,n} | 匹配m-n次 |
{0,1} | 與?相同,零次或一次 |
{1,0} | 與+相同,一次或更多 |
{0,} | 與*相同,零次或者更多 |
這個懶惰量詞直接實戰來講:
正則表達式:」8?」
匹配:一個或者0個8
正則表達式:」8??」 (懶惰)
匹配:一個8都沒匹配,由於懶惰,儘量少。
正則表達式:」8*?」 (懶惰)
匹配:一個8都沒匹配,由於懶惰,儘量少。
正則表達式:」8+?」 (懶惰)
匹配:匹配了一個8。
正則表達式:」8{3,8}?」 (懶惰)
匹配:匹配了三個8。
懶惰量詞表:
語法 | 描述 |
---|---|
?? | 懶惰匹配0-1次 |
+? | 懶惰匹配1-屢次 |
*? | 懶惰匹配0-屢次 |
{n}? | 懶惰匹配屢次 |
{n,}? | 懶惰匹配n-屢次 |
{m,n}? | 懶惰匹配m-n次 |
佔有量詞表:
語法 | 描述 |
---|---|
?+ | 佔有匹配0-1次 |
++ | 佔有匹配1-屢次 |
*+ | 佔有匹配0-屢次 |
{n}+ | 佔有匹配屢次 |
{n,}+ | 佔有匹配n-屢次 |
{m,n}+ | 佔有匹配m-n次 |
例子:
正則表達式:」1.*+」
匹配:全部的1全被高亮。
正則表達式:」.*+1」
匹配:沒有匹配,由於沒有回朔。
正則表達式:」.*1」
匹配:匹配末尾爲1的字串,貪心模式。
這裏介紹的量詞算是正則表達式效率方面的精華所在,沒啥解釋的,繼續裝逼繼續飛。
環視是非捕獲分組,也稱做零寬斷言。
例子:
正則表達式:」(?i)aaa (?=bbb)」
原始串:」aaa ccc bbb aaa bbb ccc aaa」
匹配:只匹配第二處」aaa」。
以上就是匹配aaa,同時要求aaa單詞以後緊隨的是bbb。使用了正前瞻達到目的。
反前瞻是正前瞻的取反操做。
例子:
正則表達式:」(?i)aaa (?!bbb)」
原始串:」aaa ccc bbb aaa bbb ccc」
匹配:只匹配第一處」aaa」。
以上就是匹配aaa,同時要求aaa單詞以後緊隨的不能是bbb。使用了反前瞻達到目的。
正後顧與正前瞻方向相反。
例子:
正則表達式:」(?<=aaa) bbb」
原始串:」aaa ccc bbb aaa bbb ccc aaa 」
匹配:只匹配第二處」bbb」。
反後顧與反前瞻方向相反。
例子:
正則表達式:」(?
這塊更加不須要BB總結,就是例子理解,照貓畫虎就行。
做者:工匠若水
來源:CSDN
原文:https://blog.csdn.net/yanbober/article/details/45556185 版權聲明:本文爲博主原創文章,轉載請附上博文連接!