分享一下我老師大神的人工智能教程。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智能的隊伍中來!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 編輯器。 如他們所說,剩下的就是衆所周知的歷史了。從那時起直至現在正則表達式都是基於文本的編輯器和搜索工具中的一個重要部分。
|
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