正則表達式詳解

分享一下我老師大神的人工智能教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

               

前言

正則表達式是煩瑣的,但是強大的,學會之後的應用會讓你除了提高效率外,會給你帶來絕對的成就感。只要認真去閱讀這些資料,加上應用的時候進行一定的參考,掌握正則表達式不是問題。


 1. 引子

  目前,正則表達式已經在很多軟件中得到廣泛的應用,包括*nix(Linux, Unix等),HP等操作系統,PHP,C#,Java等開發環境,以及很多的應用軟件中,都可以看到正則表達式的影子。

  正則表達式的使用,可以通過簡單的辦法來實現強大的功能。爲了簡單有效而又不失強大,造成了正則表達式代碼的難度較大,學習起來也不是很容易,所以需要付出一些努力才行,入門之後參照一定的參考,使用起來還是比較簡單有效的。

例子: ^.+@.+\\..+$

  這樣的代碼曾經多次把我自己給嚇退過。可能很多人也是被這樣的代碼給嚇跑的吧。繼續閱讀本文將讓你也可以自由應用這樣的代碼。

  注意:這裏的第7部分跟前面的內容看起來似乎有些重複,目的是把前面表格裏的部分重新描述了一次,目的是讓這些內容更容易理解。

2. 正則表達歷史

  正則表達式的“祖先”可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網絡。

  1956 年, 一位叫 Stephen Kleene 的數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了一篇標題爲“神經網事件的表示法”的論文,引入了正則表達式的概念。正則表達式就是用來描述他稱爲“正則集的代數”的表達式,因此採用“正則表達式”這個術語。

  隨後,發現可以將這一工作應用於使用 Ken Thompson 的計算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要發明人。正則表達式的第一個實用應用程序就是 Unix 中的 qed 編輯器。

  如他們所說,剩下的就是衆所周知的歷史了。從那時起直至現在正則表達式都是基於文本的編輯器和搜索工具中的一個重要部分。


3. 正則表達式定義

  正則表達式(regular expression)描述了一種字符串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。

  • 列目錄時, dir *.txt或ls *.txt中的*.txt就是一個正則表達式,因爲這裏*與正則式的*的含義是不同的。

  正則表達式是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲元字符)組成的文字模式。正則表達式作爲一個模板,將某個字符模式與所搜索的字符串進行匹配。

3.1 字符

  1、普通字符:

           由所有那些未顯式指定爲元字符的打印和非打印字符組成。這包括所有的大寫和小寫字母字符,所有數字,所有標點符號以及一些符號。

  2、非打印字符:

字符含義
\cx匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。否則,將 c 視爲一個原義的 'c' 字符。
\f匹配一個換頁符。等價於 \x0c 和 \cL。
\n匹配一個換行符。等價於 \x0a 和 \cJ。
\r匹配一個回車符。等價於 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。
\t匹配一個製表符。等價於 \x09 和 \cI。
\v匹配一個垂直製表符。等價於 \x0b 和 \cK。


3、元字符(特殊字符):

   所謂元字符(特殊字符),就是一些有特殊含義的字符,如上面說的"*.txt"中的*,簡單的說就是表示任何字符串的意思。如果要查找文件名中有*的文件,則需要對*進行轉義,即在其前加一個\。ls \*.txt。正則表達式有以下特殊字符。

          要在正則表達式模式中包含元字符以使其不具有特殊含義,您必須使用反斜槓 (\) 轉義字符。例如,下面的正則表達式與順序依次爲字母 A、字母 B、星號和字母 C 的模式匹配:

         /AB\*C/;

元字符說明
$匹配輸入字符串的結尾位置。如果設置了 RegExp 對象的 Multiline 屬性,則 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,請使用 \$。
( )標記一個子表達式的開始和結束位置。子表達式可以獲取供以後使用。要匹配這些字符,請使用  '。
(?:pattern)匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。這在使用 "或" 字符 (|) 來組合一個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達式。
(?=pattern)正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始。
(?!pattern)負向預查,在任何不匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字符之後開始
x|y匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。
[xyz]字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。
[^xyz]負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。
[a-z]字符範圍。匹配指定範圍內的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 範圍內的任意小寫字母字符。
[^a-z]負值字符範圍。匹配任何不在指定範圍內的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 範圍內的任意字符。
\b匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\cx匹配由 x 指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。x 的值必須爲 A-Z 或 a-z 之一。否則,將 c 視爲一個原義的 'c' 字符。
\d匹配一個數字字符。等價於 [0-9]。
\D匹配一個非數字字符。等價於 [^0-9]。
\f匹配一個換頁符。等價於 \x0c 和 \cL。
\n匹配一個換行符。等價於 \x0a 和 \cJ。
\r匹配一個回車符。等價於 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、製表符、換頁符等等。等價於 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等價於 [^ \f\n\r\t\v]。
\t匹配一個製表符。等價於 \x09 和 \cI。
\v匹配一個垂直製表符。等價於 \x0b 和 \cK。
\w匹配包括下劃線的任何單詞字符。等價於'[A-Za-z0-9_]'。
\W匹配任何非單詞字符。等價於 '[^A-Za-z0-9_]'。
\xn匹配 n,其中 n 爲十六進制轉義值。十六進制轉義值必須爲確定的兩個數字長。例如,'\x41' 匹配 "A"。'\x041' 則等價於 '\x04' & "1"。正則表達式中可以使用 ASCII 編碼。.
\num匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。例如,'(.)\1' 匹配兩個連續的相同字符。
\n標識一個八進制轉義值或一個向後引用。如果 \n 之前至少 n 個獲取的子表達式,則 n 爲向後引用。否則,如果 n 爲八進制數字 (0-7),則 n 爲一個八進制轉義值。
\nm標識一個八進制轉義值或一個向後引用。如果 \nm 之前至少有 nm 個獲得子表達式,則 nm 爲向後引用。如果 \nm 之前至少有 n 個獲取,則 n 爲一個後跟文字 m 的向後引用。如果前面的條件都不滿足,若 n 和 m 均爲八進制數字 (0-7),則 \nm 將匹配八進制轉義值 nm。
\nml如果 n 爲八進制數字 (0-3),且 m 和 l 均爲八進制數字 (0-7),則匹配八進制轉義值 nml。
\un匹配 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字符。例如, \u00A9 匹配版權符號 (?)。

6. 部分例子

正則表達式說明
/\b([a-z]+) \1\b/gi一個單詞連續出現的位置
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/將一個URL解析爲協議、域、端口及相對路徑
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/定位章節的位置
/[-a-z]/A至z共26個字母再加一個-號。
/ter\b/可匹配chapter,而不能terminal
/\Bapt/可匹配chapter,而不能aptitude
/Windows(?=95 |98 |NT )/可匹配Windows95或Windows98或WindowsNT,當找到一個匹配後,從Windows後面開始進行下一次的檢索匹配。

7. 正則表達式匹配規則

7.1 基本模式匹配


   一切從最基本的開始。模式,是正規表達式最基本的元素,它們是一組描述字符串特徵的字符。模式可以很簡單,由普通的字符串組成,也可以非常複雜,往往用特殊的字符表示一個範圍內的字符、重複出現,或表示上下文。例如:

^once

  這個模式包含一個特殊的字符^,表示該模式只匹配那些以once開頭的字符串。例如該模式與字符串"once upon a time"匹配,與"There once was a man from NewYork"不匹配。正如如^符號表示開頭一樣,$符號用來匹配那些以給定模式結尾的字符串。

bucket$

  這個模式與"Who kept all of this cash in a bucket"匹配,與"buckets"不匹配。字符^和$同時使用時,表示精確匹配(字符串與模式一樣)。例如:

^bucket$

  只匹配字符串"bucket"。如果一個模式不包括^和$,那麼它與任何包含該模式的字符串匹配。例如:模式

once

與字符串

There once was a man from NewYork
Who kept all of his cash in a bucket.

是匹配的。

   在該模式中的字母(o-n-c-e)是字面的字符,也就是說,他們表示該字母本身,數字也是一樣的。其他一些稍微複雜的字符,如標點符號和白字符(空格、製表符等),要用到轉義序列。所有的轉義序列都用反斜槓(\)打頭。製表符的轉義序列是:\t。所以如果我們要檢測一個字符串是否以製表符開頭,可以用這個模式:

^\t

類似的,用\n表示“新行”,\r表示回車。其他的特殊符號,可以用在前面加上反斜槓,如反斜槓本身用\\表示,句號.用\.表示,以此類推

7.2 字符簇

在INTERNET的程序中,正規表達式通常用來驗證用戶的輸入。當用戶提交一個FORM以後,要判斷輸入的電話號碼、地址、EMAIL地址、信用卡號碼等是否有效,用普通的基於字面的字符是不夠的。
所以要用一種更自由的描述我們要的模式的辦法,它就是字符簇。要建立一個表示所有元音字符的字符簇,就把所有的元音字符放在一個方括號裏:

[AaEeIiOoUu]

這個模式與任何元音字符匹配,但只能表示一個字符。用連字號可以表示一個字符的範圍,如:

[a-z] //匹配所有的小寫字母 
[A-Z] //匹配所有的大寫字母 
[a-zA-Z] //匹配所有的字母 
[0-9] //匹配所有的數字 
[0-9\.\-] //匹配所有的數字,句號和減號 
[ \f\r\t\n] //匹配所有的白字符

同樣的,這些也只表示一個字符,這是一個非常重要的。如果要匹配一個由一個小寫字母和一位數字組成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的話,用這個模式:

^[a-z][0-9]$

儘管[a-z]代表26個字母的範圍,但在這裏它只能與第一個字符是小寫字母的字符串匹配。

前面曾經提到^表示字符串的開頭,但它還有另外一個含義。當在一組方括號裏使用^是,它表示“非”或“排除”的意思,常常用來剔除某個字符。還用前面的例子,我們要求第一個字符不能是數字:

^[^0-9][0-9]$

這個模式與"&5"、"g7"及"-2"是匹配的,但與"12"、"66"是不匹配的。下面是幾個排除特定字符的例子:

[^a-z] //除了小寫字母以外的所有字符 
[^\\\/\^] //除了(\)(/)(^)之外的所有字符 
[^\"\'] //除了雙引號(")和單引號(')之外的所有字符

特殊字符"." (點,句號)在正規表達式中用來表示除了“新行”之外的所有字符。所以模式"^.5$"與任何兩個字符的、以數字5結尾和以其他非“新行”字符開頭的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一個“新行”的字符串。

PHP的正規表達式有一些內置的通用字符簇,列表如下:

字符簇 含義 
[[:alpha:]] 任何字母 
[[:digit:]] 任何數字 
[[:alnum:]] 任何字母和數字 
[[:space:]] 任何白字符 
[[:upper:]] 任何大寫字母 
[[:lower:]] 任何小寫字母 
[[:punct:]] 任何標點符號 
[[:xdigit:]] 任何16進制的數字,相當於[0-9a-fA-F]

7.3 確定重複出現

到現在爲止,你已經知道如何去匹配一個字母或數字,但更多的情況下,可能要匹配一個單詞或一組數字。一個單詞有若干個字母組成,一組數字有若干個單數組成。跟在字符或字符簇後面的花括號({})用來確定前面的內容的重複出現的次數。

字符簇 含義 
^[a-zA-Z_]$ 所有的字母和下劃線 
^[[:alpha:]]{3}$ 所有的3個字母的單詞 
^a$ 字母a 
^a{4}$ aaaa 
^a{2,4}$ aa,aaa或aaaa 
^a{1,3}$ a,aa或aaa 
^a{2,}$ 包含多於兩個a的字符串 
^a{2,} 如:aardvark和aaab,但apple不行 
a{2,} 如:baad和aaa,但Nantucket不行 
\t{2} 兩個製表符 
.{2} 所有的兩個字符

這些例子描述了花括號的三種不同的用法。一個數字,{x}的意思是“前面的字符或字符簇只出現x次”;一個數字加逗號,{x,}的意思是“前面的內容出現x或更多的次數”;兩個用逗號分隔的數字,{x,y}表示“前面的內容至少出現x次,但不超過y次”。我們可以把模式擴展到更多的單詞或數字:

^[a-zA-Z0-9_]{1,}$ //所有包含一個以上的字母、數字或下劃線的字符串 
^[0-9]{1,}$ //所有的正數 
^\-{0,1}[0-9]{1,}$ //所有的整數 
^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小數

最後一個例子不太好理解,是嗎?這麼看吧:與所有以一個可選的負號(\-{0,1})開頭(^)、跟着0個或更多的數字([0-9]{0,})、和一個可選的小數點(\.{0,1})再跟上0個或多個數字([0-9]{0,}),並且沒有其他任何東西($)。下面你將知道能夠使用的更爲簡單的方法。

特殊字符"?"與{0,1}是相等的,它們都代表着:“0個或1個前面的內容”或“前面的內容是可選的”。所以剛纔的例子可以簡化爲:

^\-?[0-9]{0,}\.?[0-9]{0,}$

特殊字符"*"與{0,}是相等的,它們都代表着“0個或多個前面的內容”。最後,字符"+"與 {1,}是相等的,表示“1個或多個前面的內容”,所以上面的4個例子可以寫成:

^[a-zA-Z0-9_]+$ //所有包含一個以上的字母、數字或下劃線的字符串 
^[0-9]+$ //所有的正數 
^\-?[0-9]+$ //所有的整數 
^\-?[0-9]*\.?[0-9]*$ //所有的小數

當然這並不能從技術上降低正規表達式的複雜性,但可以使它們更容易閱讀。

  

8.posix和perl標準的正則表達式區別

PHP同時使用兩套正則表達式規則,一套是由電氣和電子工程師協會(IEEE)制定的POSIX Extended 1003.2兼容正則(事實上PHP對此標準的支持並不完善),另一套來自PCRE(Perl Compatible Regular Expression)庫提供PERL兼容正則,這是個開放源代碼的軟件,作者爲 Philip Hazel。

使用POSIX兼容規則的函數有:
ereg_replace()
ereg()
eregi()
eregi_replace()
split()
spliti()
sql_regcase()
mb_ereg_match()
mb_ereg_replace()
mb_ereg_search_getpos()
mb_ereg_search_getregs()
mb_ereg_search_init()
mb_ereg_search_pos()
mb_ereg_search_regs()
mb_ereg_search_setpos()
mb_ereg_search()
mb_ereg()
mb_eregi_replace()
mb_eregi()
mb_regex_encoding()
mb_regex_set_options()
mb_split()

使用PERL兼容規則的函數有:
preg_grep()
preg_replace_callback()
preg_match_all()
preg_match()
preg_quote()
preg_split()
preg_replace()

定界符:

POSIX兼容正則沒有定界符,函數的相應參數會被認爲是正則。

PERL兼容正則可以使用任何不是字母、數字或反斜線(/)的字符作爲定界符,如果作爲定界符的字符必須被用在表達式本身中,則需要用反斜線轉義。也可以使用(),{},[] 和 <> 作爲定界符

修正符:

POSIX兼容正則沒有修正符。

PERL兼容正則中可能使用的修正符(修正符中的空格和換行被忽略,其它字符會導致錯誤):

i (PCRE_CASELESS):
匹配時忽略大小寫。

m(PCRE_MULTILINE):
當設定了此修正符,行起始(^)和行結束($)除了匹配整個字符串開頭和結束外,還分別匹配其中的換行符(/n)的之後和之前。

s(PCRE_DOTALL):
如果設定了此修正符,模式中的圓點元字符(.)匹配所有的字符,包括換行符。沒有此設定的話,則不包括換行符。

x(PCRE_EXTENDED):
如果設定了此修正符,模式中的空白字符除了被轉義的或在字符類中的以外完全被忽略。

e:
如果設定了此修正符,preg_replace() 在替換字符串中對逆向引用作正常的替換,將其作爲 PHP 代碼求值,並用其結果來替換所搜索的字符串。 只有 preg_replace() 使用此修正符,其它 PCRE 函數將忽略之。

A(PCRE_ANCHORED):
如果設定了此修正符,模式被強制爲“anchored”,即強制僅從目標字符串的開頭開始匹配。

D(PCRE_DOLLAR_ENDONLY):
如果設定了此修正符,模式中的行結束($)僅匹配目標字符串的結尾。沒有此選項時,如果最後一個字符是換行符的話,也會被匹配在裏面。如果設定了 m 修正符則忽略此選項。

S:
當一個模式將被使用若干次時,爲加速匹配起見值得先對其進行分析。如果設定了此修正符則會進行額外的分析。目前,分析一個模式僅對沒有單一固定起始字符的 non-anchored 模式有用。

U(PCRE_UNGREEDY):
使“?”的默認匹配成爲貪婪狀態的。

X(PCRE_EXTRA):
模式中的任何反斜線後面跟上一個沒有特殊意義的字母導致一個錯誤,從而保留此組合以備將來擴充。默認情況下,一個反斜線後面跟一個沒有特殊意義的字母被當成該字母本身。

u(PCRE_UTF8):
模式字符串被當成UTF-8。

邏輯區隔:

POSIX兼容正則和PERL兼容正則的邏輯區隔符號作用和使用方法完全一致:
[]:包含任選一操作的相關信息。
{}:包含匹配次數的相關信息。
():包含一個邏輯區間的相關信息,可被用來進行引用操作。
|:表示“或”,[ab]和a|b是等價的。

元字符與“[]”相關:

有兩組不同的元字符:一種是模式中除了方括號內都能被識別的,還有一種是在方括號“[]”內被識別的。

POSIX兼容正則和PERL兼容正則“[]之外”“一致”的元字符:
/ 有數種用途的通用轉義符
^ 匹配字符串的開頭
$ 匹配字符串的結尾
? 匹配0或者1
* 匹配 0 個或多個前面指定類型的字符
+ 匹配 1 個或多個前面指定類型的字符

POSIX兼容正則和PERL兼容正則“[]之外”“不一致”的元字符:
. PERL兼容正則匹配除了換行符外的任意一個字符
. POSIX兼容正則匹配任意一個字符

POSIX兼容正則和PERL兼容正則“[]之內”“一致”的元字符:
/ 有數種用途的通用轉義符
^ 取反字符,但僅當其爲第一個字符時有效
- 指定字符ASCII範圍,仔細研究ASCII碼,你會發現[W-c]等價於[WXYZ//^_`abc]

POSIX兼容正則和PERL兼容正則“[]之內”“不一致”的元字符:
- POSIX兼容正則中[a-c-e]的指定會拋出錯誤。
- PERL兼容正則中[a-c-e]的指定等價於[a-e]。

匹配次數與“{}”相關:

POSIX兼容正則和PERL兼容正則在匹配次數方面完全一致:
{2}:表示匹配前面的字符2次
{2,}:表示匹配前面的字符2次或多次,默認都是貪婪(儘可能多)的匹配
{2,4}:表示匹配前面的字符2次或4次

邏輯區間與“()”相關:

使用()包含起來的區域是一個邏輯區間,邏輯區間的主要作用是體現出一些字符出現的邏輯次序,另一個用處就是可以用來引用(可以將此區間內的值引用給一個變量)。後一個作用比較奇特:
<?php
$str = "http://www.163.com/";
// POSIX兼容正則:
echo ereg_replace("(.+)","<a href = //1 >//1</a>",$str);
// PERL兼容正則:
echo preg_replace("/(.+)/","<a href = $1 >$1</a>",$str);
// 顯示兩個鏈接
?>

在引用的時候,括號是可以嵌套的,邏輯次序是按照“(”出現的次序來標定的。

類型匹配:

POSIX兼容正則:
[:upper:]:匹配所有的大寫字母
[:lower:]:匹配所有的小寫字母
[:alpha:]:匹配所有的字母
[:alnum:]:匹配所有的字母和數字
[:digit:]:匹配所有的數字
[:xdigit:]:匹配所有的十六進制字符,等價於[0-9A-Fa-f]
[:punct:]:匹配所有的標點符號,等價於 [.,"'?!;:]
[:blank:]:匹配空格和TAB,等價於[ /t]
[:space:]:匹配所有的空白字符,等價於[ /t/n/r/f/v]
[:cntrl:]:匹配所有ASCII 0到31之間的控制符。
[:graph:]:匹配所有的可打印字符,等價於:[^ /t/n/r/f/v]
[:print:]:匹配所有的可打印字符和空格,等價於:[^/t/n/r/f/v]
[.c.]:功能不明
[=c=]:功能不明
[:<:]:匹配單詞的開始
[:>:]:匹配單詞的結尾

PERL兼容正則(這裏可以看出PERL正則的強大):
/a alarm,即 BEL 字符(’0)
/cx "control-x",其中 x 是任意字符
/e escape(’0B)
/f 換頁符 formfeed(’0C)
/n 換行符 newline(’0A)
/r 回車符 carriage return(’0D)
/t 製表符 tab(’0)
/xhh 十六進制代碼爲 hh 的字符
/ddd 八進制代碼爲 ddd 的字符,或 backreference
/d 任一十進制數字
/D 任一非十進制數的字符
/s 任一空白字符
/S 任一非空白字符
/w 任一“字”的字符
/W 任一“非字”的字符
/b 字分界線
/B 非字分界線
/A 目標的開頭(獨立於多行模式)
/Z 目標的結尾或位於結尾的換行符前(獨立於多行模式)
/z 目標的結尾(獨立於多行模式)
/G 目標中的第一個匹配位置


一、校驗數字的表達式


1、數字:^[0-9]*$


2、n位的數字:^\d{n}$

3、至少n位的數字:^\d{n,}$

4、m-n位的數字:^\d{m,n}$

5、零和非零開頭的數字:^(0|[1-9][0-9]*)$

6、非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$

7、帶1-2位小數的正數或負數:^(\-)?\d+(\.\d{1,2})?$

8、正數、負數、和小數:^(\-|\+)?\d+(\.\d+)?$

9、有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$

10、有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$

11、非零的正整數:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$

12、非零的負整數:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$

13、非負整數:^\d+$ 或 ^[1-9]\d*|0$

14、非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

15、非負浮點數:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

16、非正浮點數:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

17、正浮點數:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

18、負浮點數:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

19、浮點數:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$


二、校驗字符的表達式


1、漢字:^[\u4e00-\u9fa5]{0,}$

2、英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

3、長度爲3-20的所有字符:^.{3,20}$

3、由26個英文字母組成的字符串:^[A-Za-z]+$

5、由26個大寫英文字母組成的字符串:^[A-Z]+$

6、由26個小寫英文字母組成的字符串:^[a-z]+$

7、由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$

8、由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$

9、中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$

10、中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

11、可以輸入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+

12、禁止輸入含有~的字符:[^~\x22]+


三、特殊需求表達式


1、Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

2、域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

3、 InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$

4、手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

5、電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$

6、國內電話號碼(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}

7、身份證號(15位、18位數字):^\d{15}|\d{18}$

8、短身份證號碼(數字、字母x結尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

9、帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$

10、密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$

11、強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

12、日期格式:^\d{4}-\d{1,2}-\d{1,2}

13、一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$

14 、一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$

15、錢的輸入格式:

  • 有四種錢的表示形式我們可以接受:"10000.00" 和 "10,000.00", 和沒有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$

  • 這表示任意一個不以0開頭的數字,但是,這也意味着一個字符"0"不通過,所以我們採用下面的形式:^(0|[1-9][0-9]*)$

  • 一個0或者一個不以0開頭的數字.我們還可以允許開頭有一個負號:^(0|-?[1-9][0-9]*)$

  • 這表示一個0或者一個可能爲負的開頭不爲0的數字.讓用戶以0開頭好了.把負號的也去掉,因爲錢總不能是負的吧.下面我們要加的是說明可能的小數部分:^[0-9]+(.[0-9]+)?$

  • 5.必須說明的是,小數點後面至少應該有1位數,所以"10."是不通過的,但是 "10" 和 "10.2" 是通過的:^[0-9]+(.[0-9]{2})?$

  • 6.這樣我們規定小數點後面必須有兩位,如果你認爲太苛刻了,可以這樣:^[0-9]+(.[0-9]{1,2})?$

  • 這樣就允許用戶只寫一位小數.下面我們該考慮數字中的逗號了,我們可以這樣:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$

  • 1到3個數字,後面跟着任意個 逗號+3個數字,逗號成爲可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$

  • 備註:這就是最終結果了,別忘了"+"可以用"*"替代如果你覺得空字符串也可

  • 以接受的話(奇怪,爲什麼?)最後,別忘了在用函數時去掉去掉那個反斜槓,一般的錯誤都在這裏

16、xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

17、中文字符的正則表達式:[\u4e00-\u9fa5]

18、雙字節字符:[^\x00-\xff] (包括漢字在內,可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1))

19、空白行的正則表達式:\n\s*\r (可以用來刪除空白行)

20、HTML標記的正則表達式:<(\S*?)[^>]*>.*?</\1>|<.*? /> (網上流傳的版本太糟糕,上面這個也僅僅能部分,對於複雜的嵌套標記依舊無能爲力)

21、首尾空白字符的正則表達式:^\s*|\s*$或(^\s*)|(\s*$) (可以用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),非常有用的表達式)

22、 騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)

23、中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼爲6位數字)

24、IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址時有用)

25、 IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))


           

分享一下我老師大神的人工智能教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!https://blog.csdn.net/jiangjunshow

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章