高級Oracle DBA,善長Linux系統維運以及Oracle數據庫管理,開發,調優. 具有多年PL/SQL開發經驗.
分类:
2007-03-09 09:22:50
Regex學習日記
第一章:
Regex 基礎.
-------------------------------------------------------------------------
正則表達式的歷史
regex : 稱為正則表達式 ,又稱為字串模板
正則表達式的“祖先”可以一直上溯至對人類神經系統如何工作的早期研究。Warren McCulloch
和 Walter Pitts 這兩位神經生理學家研究出一种數學方式來描述這些神經网絡。
1956 年, 一位叫 Stephen Kleene 的數學家在 McCulloch 和 Pitts 早期工作的基礎上,發表了
一篇標題為“神經网事件的表示法”的論文,引入了正則表達式的概念。正則表達式就是用來描述他稱為
“正則集的代數”的表達式,因此采用“正則表達式"這個術語.
之后,發現可以將這一工作應用于使用 Ken Thompson 的計算搜索算法的一些早期研究,
Ken Thompson 是 Unix 的主要發明人。正則表達式的第一個實用應用程序就是 Unix 中的 qed 編輯器。
學習它有什麼用途 ?
我舉幾個例子說明.
1. 判斷一個字串是由某些字符組成. 如日期,數字,長度範圍,
2. 提取字串中某一部份. 如 Order No : A0234 Mat:41100234 中的A0234
提取網頁中所有的URL,
3. 搜索某個字符串的位置.
Regex在哪里?
編程語言中,C,C++,Delphi,Java,javascript,php,perl,asp, C# ..
數據庫,Oracle 10g, DB2, MySQL, ..
編輯器,UltraEdit,Word..... 我只是列舉了Windows平台上的,因為在nix中,regex無處不在.
學習開始了:
1. 字符串:由N(n可為0至任一正整數)個字符組成. 如下 Str1,Str2
Str1: "Welcome to China"
Str2: "This is test String "
如果我們用字元符號替代字符串將便成怎麼樣呢?
2. 如果我們設定用( . )點可來替代任何字符, 那麼以下是定義是符合的
我們將用"/"符號括起模板
Str1: "Welcome to China" = /"................"/
"Welcome to China" = /"Welcome .. China"/
"Welcome to China" = /"..lco.. to Ch..a"/
Str2: "This is test String " = /"T... is test St..ng "/
3. 學會歸納合適的Regex
如: Str3 := "Welcome"
Str4 := "welcome"
我們會發現Str3,和Str4只是前面的大小寫不同,那麼可以這樣表示了
/.elcome/
這樣Str3,Str4都是符合的, 但是嚴格的你會發現aelcome,become等我不想要的也會包括進來,
這可不是預期我想要的. 請看下一步.
5. 如果用[]符號限定搜索范圍, 那就是表示,字符只能為[]中的某一個.這樣就好了,就變成如下
Str3 = /[wW]elcome/
那麼我們可以知道了
[a-z] :表示為任一小寫字母
[A-Z] :表示為任一小寫字母
[0-9] :表示為任一數字
[a-zA-Z] :是表示任一寫字母
[a-zA-Z0-9] :....
[ \t\n] : "任何一個空白類字元"
......
[a-f2-4] :這樣也是可行的
6. 如果說我要的是只要不是數字就行了呢,那也可行的. 我們在[]里加上^符號.
[0-9] 就變成了 [^0-9] .任何一個非數字都符合了.
[^a-z] : ...
[^f] : ...
....
7. 實際上 我們可能需要更多的規則, 如某個符號來簡化表示為一個數字,一個字母,一個單詞,
一個可列印字符,一個空格等等,以及字串頭,字串尾等,在各種語言中的定義可能會有細微的差別.
以perl為例.
\d 其實就是 [0-9], "任何一個數字"
\D 其實就是 [^0-9], "任何一個非數字"
\w 其實就是 [a-zA-Z0-9_], "任何一個文數字"
\W 其實就是 [^a-zA-Z0-9_], "任何一個非文數字"
\s 其實就是 [ \t\n], "任何一個空白類字元"
\S 其實就是 [^ \t\n], "任何一個非空白類字元"
8. 但是,如果我要的只是需要匹配 . \ ^ 等符號, 那麼需要對它進行轉義,就反斜線.
\. \^ \\ \[ \]
如上就可以了.
測試:
1. 寫出日期的正則表達式, yyyy-mm-dd ,yyyy/mm/dd 2005-08-20 2005/08/20
2. 你明白/\[[0-9]\]/表達式的意思嗎,寫出一個符合的字符串.
Write :阿飛
Date : 2005-08-02