正則表達式入門01

導讀:正則表達式

       正則表達式歸根結底就是一個表達式而已,只不過這個表達式的書寫變幻無窮,學習正則表達式很大程度上就是學習正則表達式的語法規則,讓人無比頭痛。在學習正則表達式以前建議穩住本身的心態,多看看前輩們對它的描述講解,讓本身對其有必定的認知,而後最好準備好一個練習工具以及相關的正則表達式說明文檔來輔助學習,我使用的是Regex Match Tracer工具(好不容易找到的免費的工具),工具的工做環境是這樣的:數據庫

很明顯能夠看出來上面工具的構造,上面輸入內容爲正則表達式,下面輸入內容爲要進行匹配的數據內容,雖簡陋可是對於新手入門來講仍是夠用了。編程

附上工具下載連接:http://www.regexlab.com/zh/mtracer/download.htm編程語言

在線正則表達式解析工具:https://regexper.com/編輯器

ps:相信有了它們就算開始學走路也不會摔得太慘,加油吧。工具

定義:描述了一個規則,經過這個規則能夠匹配一類字符串。學習

優點:一種強大靈活的文本處理"工具",大部分編程語言,數據庫,文本編輯器,開發環境都支持正則表達式。測試

使用流程:spa

1.分析所要匹配的數據,寫出測試用的典型數據。regexp

2.在工具軟件中進行匹配測試。

3.在程序中調用經過測試的正則表達式。

接下來開始認識正則表達式裏面包含的元素。。。

普通字符:

字母,下劃線,數字,漢字以及沒有特殊定義的標點符號都是普通字符,在匹配一個字符串的時候匹配與之相同的一個字符。

簡單的轉義字符:

\n:表明換行符
\t:製表符
\\:表明\自己
\?,\+,\-,\*,\$,\],\[,\{,\},\(,\),\.:匹配這些字符自己

標準字符集合:可以與多種字符匹配,區分大小寫,大寫是相反的意思

\d:匹配任意一個0-9數字:

\w:匹配任意一個字母或數字或下劃線,也就是A-Z,0-9,_,a-z中任意一個:

\s:包括空格,製表符,換行等空白字符的其中任意一個:
小數點能夠匹配任意一個字符,若是要匹配包括換行\n在內的全部字符,可使用[\s\S]

 

自定義字符集合:[]方括號匹配模式,可以匹配方括號中任意一個字符

[abc@]:匹配"a","b","c","@"之中任意字符:

[^abc]:匹配"a","b","c"以外的任意一個字符:

[f-k]:匹配"f"-"k"之間任意一個字母:

[^A-F0-3]:匹配除"A"-"F"以及0-3以外的任意一個字符:


正則表達式的特殊符號若是被包含在[]中則會失去特殊意義,除了^和-兩個符號。

標準字符集合,除小數點之外若是被包含在[]中,自定義字符集合將包含該集合。 

量詞:修飾匹配次數的特殊符號

{m}:表達式重複m次:

{m,n}:表達式最少重複m次,最多重複n次:

{m,}:表達式最少重複m次:

?:匹配表達式0次或1次,至關於{0,1}:

+:匹配表達式至少出現一次至關於{1,}:

*:匹配表達式不出現或出現任意次,至關於{0,}:

貪婪模式:
匹配字符越多越好,默認爲貪婪模式!
非貪婪模式:
匹配字符越少越好,修飾匹配次數的特殊符號後再加上一個?號。

 

字符邊界(零寬):該標記匹配的不是字符而是位置,符合某種條件的位置

^:與字符串開始的地方匹配:

$:與字符串結束的地方匹配:

\b:匹配一個單詞邊界(前面的字符和後面的字符不全是\w):

匹配模式:

1.忽略大小寫模式:匹配時忽略大小寫,而默認狀況下是區分大小寫的。

2.單行模式:整個文本看作一個字符串,只有一個開頭,一個結尾。使小數點"."能夠匹配包含換行符\n在內的任意字符。

3.多行模式:每行都是一個字符串,都有開頭和結尾。使用該模式後,若是須要僅匹配字符串開始和結束位置。可使用\A和\Z。

選擇符和分組:

|(分支結構):左右兩邊表達式爲"或"的關係,匹配左邊或是右邊:

()(捕獲組):在被修飾匹配次數時括號內的表達式能夠做爲總體被修飾,取匹配結果時括號中的表達式匹配到的內容能夠被單獨獲得,每一對括號會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號。捕獲元素爲0的第一個捕獲是由整個正則表達式模式匹配的文本:

(?:Exception)(非捕獲組):一些表達式中不得不使用(),但又不須要保存()中子表達式匹配的內容,這時能夠用非捕獲組來抵消使用()帶來的反作用:

反向引用:(\nnn)

1.每一對()會分配一個編號,使用()的捕獲根據左括號的順序從1開始自動編號。

2.經過反向引用,能夠對分組已捕獲的字符串來進行引用。

預搜索(零寬斷言):

1.只進行子表達式的匹配,匹配內容不計入最終的匹配結果,是零寬度。

2.這個位置應該符合某個條件,判斷當前位置的先後字符,是否符合指定的條件,但不匹配先後的字符,是對位置的匹配。

3.正則表達式匹配過程當中,若是子表達式匹配到的是字符內容,而非位置,並被保存到最終的匹配結果中,那麼就認爲這個子表達式是佔有字符的;若是子表達式匹配的僅僅是位置,或者匹配的內容並不保存到最終的匹配結果中,那麼就認爲這個子表達式是零寬度的。佔有字符仍是零寬度,是針對匹配的內容是否保存到最終的匹配結果中而言的。

(?=Exp):斷言自身出現的位置的後面能匹配表達式Exp:

(?<=Exp):斷言自身出現的位置的前面可以匹配表達式Exp:

(?!Exp):斷言自身出現的位置的後面不能匹配表達式EXP:

(?<!Exp):斷言自身出現的位置的前面不能匹配表達式Exp:

練習:

1.匹配座機電話號碼 :以"0"開頭,中間包含"-"符號

2.匹配郵箱帳號:中間包含@符號

(1)qq郵箱:

(2)網易郵箱:

(3)移動郵箱:

3.匹配移動電信手機號碼,以13,,15,18開頭的爲移動號,17開頭的爲電信號

顯然這樣寫可能會出現問題,就是當電話號碼的形式發生改變時須要從新定義正則表達式,因此效率較爲低下。所以闊以採用更高效的方法來實現這樣的操做。

這樣寫一會兒就闊以匹配各類形式的電話號碼,簡單高效,易用性良好。

 

 

 

 

 

 

 

 

 

 

 

 

ps:文章待完善,後續內容會繼續跟進。

相關文章
相關標籤/搜索