看板 SFFamily 關於我們 聯絡資訊
※ [本文轉錄自 java 看板] 發信人: yoshi.bbs@whshs.cs.nccu.edu.tw (終於翻譯完了...), 看板: java 標 題: Regular Expression 發信站: 政大狂狷年少 (Sat Oct 26 01:11:54 2002) 轉信站: Ptt!news.ntu!freebsd.ntu!news.cis.nctu!news.cs.nthu!WHSHS 在jdk1.4之後(不知有沒有記錯), 加入了Regular Expression 由於沒學過, 所以去JavaWorld找了文章來看, 總共有三頁 我一邊看一邊翻譯了第一頁, 分享給有需要的人. 如果對翻譯的文章有建議的話(比如文句不順,誤譯..等等) 麻煩請告知, 許多名詞我覺得相當難中譯... 另外, 此文只是我一邊讀, 一邊寫下的翻譯筆記, 請盡量不要嫌這篇文章... 作者: yoshi (anything) 站內: P_Yoshi 標題: Regular Express Page I 時間: Fri Oct 25 23:37:46 2002 以Regular Expression來做比對工作 ----------------------------- 原文:Benedict Chng 譯文:Yoshi Huang 原文網址:http://www.javaworld.com/javaworld/jw-07-2001/jw-0713-regex.html 使用Regular Expression的強大功能來做簡單文字的轉換與處理 如果你曾經以Perl, 或其他內建Regular Expression功能的程式語言來編寫程式. 你就會知道用Regular Expression來處理文字, 比對字串...等工作有多簡單. 如果你對Regular Expression沒有概念, 其實Regular Expression只是許多字元中的一 部份,定義以用來尋找一個對應的字串. (Regular Expression以下簡寫為RegExp.) 許多的程式語言, 包括了Perl, PHP, Python, JavaScript,以及JScript, 現在都支 援RegExp.的文字處理, 而某些功能較為強大的文字編輯器, 也提供了RegExp.的功能來 處理文字搜尋, 字串取代的功能. 那Java呢? 在JDK1.4之後, RegExp. 已經被加入jdk中 了, 你可以在新版的jdk中使用這個新功能. REGULAR EXPRESSION 101 讓我們從最簡單的開始, 假設你現在要搜尋一個字串"cat", 你的RegExp. 就是很簡 單的 "cat". 如果你尋搜是忽略大小寫的, 則像是"catalog", "Catherine", 或是 "sophisticated" 都會被視為成功比對. Regular Expression: cat Matches: catalog, Catherine, sophisticated 萬用符號(.) 想像一下, 假設你今天在玩一個文字遊戲, 要找出一個't'開頭,'n'結尾的單字, 而 現在你手上有一本英文字典, 你想要找出所有附合要求的單字, 你該怎麼做? 這時候, RegExp.就派上了用場. 要在這樣的場合使用RegExp., 你必須選用萬用符號 -- 句號(.) 這個RegExp.會是"t.n", 而以下的單字都符合條件: "tan", "Ten", "tin", "ton","tpn" 甚至像是"t#n", "t n" 這類比較特殊的, 也算是符合條件. 這是因為萬元符號'.'可以 代稱所有的東西, 包含了空白也行, 或是tab符號, 甚至是換行符號. Regular Expression: t.n Matches: tan, Ten, tin, ton, t n, t#n, tpn, etc... 限定字元符號([]) 要解決萬用字元限制太少的問題, 你可以選擇你特定要的字元, 使用符號"[]", 只有 被寫在[]中的字元可以用來比對是否一樣. 因此 "t[aeio]n" 會搜尋到 "tan", "Ten", "tin", 還有"ton". 而像是"toon"這樣的字, 並不算是對應成功, 因為在[]中的字元, 一次只能選用一個. Regular Expression: t[aeio]n Matches: tan, Ten, tin, ton 任擇其一符號(|) 如果你想要剛剛上面的"toon", 也能被對應到的話, 你就可以選用這個符號(|), 他其實就是選項中任擇其一的作用, 也就是程式語言中的OR運算元, 如果你想要在剛剛 前面的例子, 也可以對應到"toon"這個字, 你的RegExp.會是"t(a|e|i|o|oo)n". 你不能再使用限定字元符號([]), 因為限字元符號是用來比對一個字元時用的, 取而代 之的, 我們使用括號"()". 你也可以用括號來做編組的功能 (後面部份會詳述) Regular Expression: t(a|e|i|o|oo)n Matches: tan, Ten, tin, ton, toon 數量符號(*,+,?, {n}, {n,m} ) 表格一寫出了每個數量符號所代表的涵意, 可以決定該字元要被重覆幾次. 表格一: Notation Number of Times ------------------------------------- * 0 or more times + 1 or more times ? 0 or 1 time {n} Exactly n number of times {n,m} n to m number of times ------------------------------------- 讓我們來假設你今天想在一篇文章裡面, 找到你的社會福利號碼, 美國的社會福利 號碼格式是999-99-9999. 你所應該使用的RegExp. 會像是Fig.1所寫的. 在RegExp.中, 連字號"-"是有特殊意義的, 在此他用來指明數字所會在的範圍(0~9). 所以, 在你想把它當做一般文字來用時, 你必須在它之前加上一個'\'符號. Hyphen Hyphen [0-9]{3} \- [0-9]{2} \- [0-9]{4} 前三個數 中間二個數 最後四個數 Fig 1. Matches: All social security numbers of the form 123-12-1234 如果你想要連字號'-'不論有或無, 都可以找得出來的RegExp. , 你可以使用'?'符號, 始得'-'符號可有可無, Fig.2所寫的RegExp. 不論是999-99-9999, 或是999999999, 都 會對應到. '-'可有可無 '-'可有可無 [0-9]{3} \-? [0-9]{2} \-? [0-9]{4} 前三個數 中間二個數 最後四個數 Fig 2. Matches: All social security numbers of the forms 123-12-1234 and 1234121234. 讓我們來看另一個例子. 美國車子的車牌號碼是由四個數字以及二個字母, RegExp. 的前面四個數字寫法是"[0-9]{4}", 再來的二個字母是"[A-Z]{2}", Fig.3 寫出了完整 的RegExp. [0-9]{4} [A-Z]{2} 前四個數 後面二個字母 Fig 3. Matches: Typical US car plate numbers, such as 8836KV 否定符號 否定符號'^'如果使用在限定字元符號中, 表示該字元你不想要被對應到. 比如像是 Fig.4所寫的, 他可以對應到所有的字元, 除了以x開頭的以外. [^x] [a-z]+ 第一個字不能是x 剩下的字元可以是a-z任何字母所組合而成 Fig 4. Matches: All words except those start with the letter x 括號與空白符號 如果你要找出一個人的生日, 典型的格式大概是: June 26, 1951. 而此RegExp.會像 Fig.5所表示: Mandatory Mandatory Year field space space up to 4 digits [a-z]+ \s+ [0-9]{1,2} , \s* [0-9]{4} Month field Day of month Optional at least 1 character up to 2 digits space Fig 5. Matches: All dates with the format of Month DD, YYYY 符號"\s"可以用來對應所有的空白字元, 連tab鍵也可以對應. 你成功的取出生日之後, 你要怎麼從生日之中, 取出月份呢? 你只要使用括號來做 分組的動作就可以了, 在月份的二旁加上括號, 建立一個組別, 之後你就可以使用 ORO API來取得這組的值 (ORO API在之後會再深入討論). 這個RegExp. 會像Fig.6 Mandantory Mandantory Year field space comma up to 4 digits ([a-z]+) \s [0-9]{1,2} , \s* [0-9]{4} Month field Day of month Optional in Group 1 up to 2 digits space Fig 6. Matches: All dates with the format Month DD, YYYY, and extracts Month field as Group 1. 其他各式各樣的符號 要讓使用上更方便, 有一些簡寫的方法可以使用, 如下表二: Notation Equivalent Notation ------------------------------- \d [0-9] \D [^0-9] \w [A-Z0-9] \W [^A-Z0-9] \s [\t\n\r\f] \S [^\t\n\r\f] ------------------------------- Table 2. Commonly used notations 比如說, 我們可以使用"\d"來表示"[0-9]", 而之前所用的社會福利號碼的RegExp., 可以 改寫成如Fig.7. Hyphen Hyphen \d{3} \- \d{2} \- \d{4} 前三數 中間二數 後面四數 Fig 7. Matches: All social security numbers of the form 123-12-1234 Page 1. Matchmaking with regular expressions. 結束 -- 每次一想到你 像雨過天晴 看見一隻蝴蝶飛過廢墟 是那麼的美麗 就像一個奇蹟 讓我從倒下的地方站起 只要一靠近你 就覺得安心 你看著我的眼沒有懷疑 你對我的相信 讓我又能重生 不管世界多冷我還有你 我有你 -- ╔═══╗ ┼────────────────────────╮ 狂狷 Origin:[ 狂 狷 年 少 ] whshs.cs.nccu.edu.tw ╰─╮ 年少 ┼╮ < IP:140.119.164.16 > ╰─╮ ╚╦═╦╝ From:61-228-5-152.HINET-IP.hinet.net ─╨─╨─ KGBBS 遨翔"BBS"的狂狷不馴;屬於年少的輕狂色彩 --   「大哥!你....」   「你在以旁門左道的方法,逼自己的劍氣踰越極限﹖」   「廢話!」應雄反駁:   「什麼旁門左道﹖能夠將最強的功力提昇至無法再上的強中之強, 才是必勝的最佳戰略!」 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.201.208.96