淺談Regex,Regex
一、什麼是Regex?
簡單的說:Regex(Regular Expression)是一種處理字串匹配的語言;
Regex描述了一種字串匹配的模式,可以用來檢查一個字串是否含有某種子串,對匹配到的子串進行“取出”或“替換”操作。
二、Regex的應用
Regex在實際的開發過程中非常實用,能夠快速解決一些複雜的字串處理問題,下面我對Regex的應用做一些簡單分類:
第一種:資料驗證
比如,你要驗證一個字串是否是正確的EMail,Telphone,Ip等等,那麼採用Regex就好非常方便。
第二種:內容尋找
比如,你要抓取一個網頁的圖片,那麼你肯定要找到標籤,這時候用Regex就可以精準的匹配到。
第三種:內容替換
比如,你要把手機號碼中間四位隱藏掉變成這種模式,123****4567,那麼採用Regex也會非常方便。
三、Regex有哪些內容
下面我將簡單的介紹一下Regex:
1、 Regex的幾個重要的概念
- 子運算式:在Regex中,如果使用"()"括起來的內容,稱之為“子運算式”
- 捕獲:子運算式匹配到的結果會被系統放在緩衝區中,這個過程,我們稱之為“捕獲”
- 反向引用:我們使用"\n",其中n是數字,表示引用之前某個緩衝區之間的內容,我們稱之為“反向引用”
2、數量限定符
- X+ 表示:1或多個
- X* 表示:0或多個
- X? 表示:0或1個
- X{n} 表示: n個
- X{n,} 表示:至少n個
- X{n,m} 表示:n至m個,貪婪原則,會儘可能匹配多個;如果在後面加個?,則為非貪婪原則
註:X表示要尋找的字元
3、 字元限定符
- \d 表示:匹配一個數字字元,[0-9]
- \D 表示:匹配一個非數字字元,[^0-9]
- \w 表示:匹配包括底線在內的單詞字元,[0-9a-zA-Z_]
- \W 表示:匹配任何非單詞字元,[^0-9a-zA-Z_]
- \s 表示:匹配任何空白字元,空格、斷行符號、定位字元
- \S 表示:匹配任何非空白字元
- . 表示:匹配任何單個字元
此外還有以下幾種:
範圍字元:[a-z]、[A-Z]、[0-9]、[0-9a-z]、[0-9a-zA-Z]
任一字元:[abcd]、[1234]
非在內的字元:[^a-z]、[^0-9]、[^abcd]
4、 定位器
- ^ 表示:開頭標識
- $ 表示:結尾標識
- \b 表示:單詞邊界
- \B 表示:非單詞邊界
5、轉義符
6、選擇匹配符
7、特殊用法
- (?=):正向預查:匹配以指定內容結束的字串
- (?!):負向預查:匹配不是以指定內容結束的字串
- (?:):不把選擇匹配符的內容放到緩衝區
四、Regex在Javascript下的使用方法
在Javascript下使用Regex,有兩種方法:
第一種方法:使用RegExp類
提供的方法有:
- test(str):在字串匹配是否有匹配模式的字串,返回true/false
- exec(str):返回匹配模式比對到的字串,如果有,返回相應的字串,無,返回null;
//如果Regex中有子運算式,使用exec方法時
//返回的是:result[0] = 匹配結果 , result[1] = 子運算式1的匹配結果 ……
第二種方法是:使用String類
提供的方法有:
- search: 返回匹配模式的字串出現的位置,如果沒有,返回-1
- match : 返回匹配模式比對到的字串,如果有,返回數組,無,返回null
- replace :將匹配模式比對到的字串進行替換
- split:將字串已匹配模式為分隔字元進行字串分隔,返回數組
五、Regex在PHP下的使用方法
PHP下有兩種使用Regex的函數:
第一種是:PerlRegex函數
提供的方法有:
- preg_grep -- 返回與模式比對的數組單元
- preg_match_all -- 進行全域Regex匹配
- preg_match -- 進行Regex匹配
- preg_quote -- 轉義Regex字元
- preg_replace_callback -- 用回呼函數執行Regex的搜尋和替換
- preg_replace -- 執行Regex的搜尋和替換
- preg_split -- 用Regex分割字串
第二種是:POSIXRegex函數
提供的方法有:
- ereg_replace -- 替換Regex
- ereg -- Regex匹配
- eregi_replace -- 不區分大小寫替換Regex
- eregi -- 不區分大小寫Regex匹配
- split -- 用Regex將字串分割到數組中
- spliti -- 用Regex不區分大小寫將字串分割到數組中
- sql_regcase -- 產生用於不區分大小的匹配的Regex
六、總結
Regex就是我們實現某個功能的一個工具,這個工具:
1、功能強大
Regex中各種限定符的不同組合會實現不同的功能,有時實現一個複雜的功能需要編寫很長的Regex,如何能精準匹配,這就要考驗一個程式員的能力了。
2、簡潔方便
平常我們在進行字串內容尋找,只能進行某個特定字串的尋找,但是Regex可以協助我們進行模糊尋找,更快更方便,僅僅需要一個Regex串。
3、各種語言基本上都支援
目前如JAVA、PHP、Javascript、C#、C++等主流語言都支援Regex。
4、學習很簡單,應用很高深
學習Regex很快也很簡單,但是如何在實際開發中編寫出高效地,精準地Regex,還是需要長時間的嘗試和積累。
Regex
正則經常用於js 判斷手機號,郵箱等,通過簡單的辦法來實現強大的功能
符號解釋
字元 描述
\ 將下一個字元標記為一個特殊字元、或一個原義字元、或一個 反向參考、或一個八進位轉義符。例如,'n' 匹配字元 "n"。'\n' 匹配一個分行符號。序列 '\\' 匹配 "\" 而 "\(" 則匹配 "("。
^ 匹配輸入字串的開始位置。如果設定了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之後的位置。
$ 匹配輸入字串的結束位置。如果設定了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。
* 匹配前面的子運算式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價於{0,}。
+ 匹配前面的子運算式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價於 {1,}。
? 匹配前面的子運算式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價於 {0,1}。
{n} n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。
{n,} n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價於 'o+'。'o{0,}' 則等價於 'o*'。
{n,m} m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價於 'o?'。請注意在逗號和兩個數之間不能有空格。
? 當該字元緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 後面時,匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串,而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如,對於字串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。
. 匹配除 "\n" 之外的任何單個字元。要匹配包括 '\n' 在內的任何字元,請使用象 '[.\n]' 的模式。
x|y 匹配 x 或 y。例如,'z......餘下全文>>
什是Regex?舉例說明一下
目前,Regex已經在很多軟體中得到廣泛的應用,包括*nix(Linux, Unix等),HP等作業系統,PHP,C#,Java等開發環境,以及很多的應用軟體中,都可以看到Regex的影子。
Regex的使用,可以通過簡單的辦法來實現強大的功能。為了簡單有效而又不失強大,造成了Regex代碼的難度較大,學習起來也不是很容易,所以需要付出一些努力才行,入門之後參照一定的參考,使用起來還是比較簡單有效。
例子: ^.+@.+\\..+$
2. Regex的曆史
Regex的“祖先”可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經生理學家研究出一種數學方式來描述這些神經網路。
1956 年, 一位叫 Stephen Kleene 的數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了一篇標題為“神經網事件的標記法”的論文,引入了Regex的概念。Regex就是用來描述他稱為“正則集的代數”的運算式,因此採用“Regex”這個術語。
隨後,發現可以將這一工作應用於使用 Ken Thompson 的計算搜尋演算法的一些早期研究,Ken Thompson 是 Unix 的主要發明人。Regex的第一個實用應用程式就是 Unix 中的 qed 編輯器。
如他們所說,剩下的就是眾所周知的曆史了。從那時起直至現在Regex都是基於文本的編輯器和搜尋工具中的一個重要部分
3. Regex定義
Regex(regular expression)描述了一種字串匹配的模式,可以用來檢查一個串是否含有某種子串、將匹配的子串做替換或者從某個串中取出符合某個條件的子串等。
列目錄時, dir *.txt或ls *.txt中的*.txt就不是一個Regex,因為這裡*與正則式的*的含義是不同的。
Regex是由一般字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。Regex作為一個模板,將某個字元模式與所搜尋的字串進行匹配。
3.1 一般字元
由所有那些未顯式指定為元字元的列印和非列印字元組成。這包括所有的大寫和小寫字母字元,所有數字,所有標點符號以及一些符號。
3.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.3 特殊字元
所謂特殊字元,就是一些有特殊含義的字元,如上面說的"*.txt"中的*,簡單的......餘下全文>>
http://www.bkjia.com/PHPjc/856578.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/856578.htmlTechArticle淺談Regex,Regex 一、什麼是Regex? 簡單的說:Regex(Regular Expression)是一種處理字串匹配的語言; 正則表達...