




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、.,1,MATLAB 程式設計:進階篇通用運算式,.,2,基本介紹:UNIX淵源,早期的電腦作業(yè)系統(tǒng)(例如 UNIX 系統(tǒng))都是以文字為介面,因此對於文字的處理與運算也就有一套特別精心規(guī)劃的方式,其中最為人所津津樂道的產(chǎn)出,就是通用運算式(Regular Expressions)的制訂和其廣泛的應用。 通用運算式最早出現(xiàn)在 UNIX 的文字編輯程式,例如 ed、vi 、emacs ,也常被用在以 UNIX 為基礎的程式語言,例如 Perl 等。近年來在 Web 上使用的 JavaScript 以及 VBScript 也加入了通用運算式的功能。,.,3,基本介紹:通用性,如果照字面來翻譯,Reg
2、ular Expressions 應該是翻成正規(guī)運算式,但我們採取的中文名稱是通用運算式或簡稱通用式,強調(diào)此方法能由簡單的符號來代表複雜的字串的特性 在本章所學習到的通用運算式,幾乎可以原封不動地搬到其他程式語言來使用,例如 JavaScript、C 、 Python、Perl、VBScript 等等。 MATLAB 6.x 的通用運算式並不支援中文,但在7.x 已經(jīng)可以完全支援中文了!,.,4,基本介紹:終極目標,你已經(jīng)在用通用式的概念了!看看你常用到的萬用符號(Wildcards characters): dir *.txt dir data?.txt 終極目標 用簡單的符號來代表複雜的字
3、串,以便進行特定字串的比對、抽取及代換,.,5,基本用法:尋找字串開始位置,使用 regexp 指令比對字串,可找出某一個特定型態(tài)的字串在另一個字串的出現(xiàn)位置。 例如,如果要找出love在一個字串Love me tender, love me sweet, never let me go出現(xiàn)的位置,可用下列程式碼: 範例4-1: regExp01.m 回傳結(jié)果為:startIndex = 17 代表love在 string 變數(shù)所出現(xiàn)的位置是 17。,string = Love me tender, love me sweet, never let me go; pattern = love;
4、 startIndex = regexp(string, pattern),.,6,基本用法:大小寫均可,若要進行大小寫均可(Ignore Cases)的比對,則可以使用 regexpi 指令 : 範例4-2: regExp02.m 回傳結(jié)果為:startIndex = 1 17 代表Love和love在 string 變數(shù)所出現(xiàn)的位置分別是 1 和 17。,string = Love me tender, love me sweet, never let me go; pattern = love; startIndex = regexpi(string, pattern),.,7,基本用法
5、:字串開始和結(jié)束位置,若要找出字串出現(xiàn)的開始和結(jié)束位置,可以在使用 regexp 時,多加一個輸出變數(shù): 範例4-3: regExp03.m 回傳結(jié)果為: start =6 22 42 finish =7 23 43 其中 start 和 finish 代表所比對到的三個me的開始和結(jié)束位置。,string = Love me tender, love me sweet, never let me go; pattern = me; start, finish = regexp(string, pattern),.,8,方括?。毫信e欲比對字元,我們可以使用方括?。ǎ﹣砹信e所要比對的字元,可見下
6、列範例: 範例4-4: regExp10.m,string = I bet there is a bat on the boat; pattern = baeiout; start, finish = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:length(start)% 列印出比對結(jié)果 fprintf(t%d: %sn, i, string(start(i):finish(i); end,回傳結(jié)果為:Matched substrings: 1: bet 2: bat,.,9,方括?。菏褂霉爣?若是連續(xù)字
7、母或數(shù)字,就可以使用範圍符號-來簡化方括弧中的列舉字元。例如, 數(shù)字 0 到 9,可以寫成 0123456789,或是簡化寫成 0-9。 26 個小寫英文字母可以簡化寫成 a-z 。 26 個大寫英文字母可以簡化寫成 A-Z。 英文字母:a-zA-Z 數(shù)字或英文字母:0-9a-zA-Z,.,10,方括?。簲?shù)字範圍,例如若要比對西元年份,可見下列範例: 範例4-5: regExp11.m,string = My brother and me were born in 1965 and 1962, respectively.; pattern = 0-90-90-90-9; start, fini
8、sh = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:length(start) % 列印出比對結(jié)果 fprintf(t%d: %sn, i, string(start(i):finish(i); end,回傳結(jié)果為:Matched substrings: 1: 1965 2: 1962,.,11,向量化的輸入和輸出,事實上,regexp 指令也可以接收向量化的輸入,並產(chǎn)生向量化的輸出,例如: 範例4-6: regExp07.m,string = Barcelona, Y2K, MATLAB 7.3; patt
9、ern = lona, 0-9, A-Z; start, finish = regexp(string, pattern),start = 6 2 1x6 double finish = 9 2 1x6 double 其中 start 和 finish 都是 1x3 的異值陣列,而且 starti 和 finishi 就是 regexp(stringi, patterni) 所得到的結(jié)果。,.,12,方括?。汗犂斜?有關方括弧的使用,列表整理如下:,像不像表情符號?,.,13,特定字元:列表,有些通用式會常被用到,因此已被定義為特定字元,以簡化整體通用式,這些字元列表說明如下:,若是針對中文
10、,可以加上全型空白。,.,14,特定字元:比對數(shù)字,我們可以用d來比對由 0 到 9 的數(shù)字,並用D來比對非數(shù)字。假設我們要找出兩個非數(shù)字夾一個數(shù)字的子字串,可使用DdD。 範例4-7: regExp04.m,string = Some terms: RU486, Y2K, 900GHz, B2B, B2C; pattern = DdD; start, finish = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:length(start) fprintf(t%d: %sn, i, string(start(i
11、):finish(i); end,回傳結(jié)果為: Matched substrings: 1: Y2K 2: B2B 3: B2C,.,15,特定字元:句點的使用,我們也可以抓出來兩個 t 中間夾 4 個任意字元的子字串,請見下例範例: 範例4-8: regExp13.m,string = I like the tidbit given by timit; pattern = t.t; start, finish = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:length(start) fprintf(t%d:
12、 %sn, i, string(start(i):finish(i); end,回傳結(jié)果為: Matched substrings: 1: tidbit 2: timit,.,16,定位符號:句首和句尾,在通用式裡,最常用的定位符號就是 和 $,其中 代表一個字串的開始位置,因此 xy 代表以 xy 開始的字串;而 $ 代表一個字串的結(jié)束位置,因此 xy$ 代表以 xy 結(jié)束的字串。 範例4-9: regExp14.m,str1 = Chapter 5 is my favorite; str2 = I like Chapter 2; pat = Chapter; fprintf(regexp(
13、%s, %s) = %dn, str1, pat, regexp(str1, pat); fprintf(regexp(%s, %s) = %dn, str2, pat, regexp(str2, pat);,回傳結(jié)果為: regexp(Chapter 1 is my favorite, Chapter) = 1 regexp(I like Chapter 1, Chapter) =,.,17,定位符號:列表,以下是對於定位符號的列表與整理:,.,18,字串的重複:範例列表,我們也可定義字元的重複次數(shù),整理如下:,.,19,字串的重複:基本範例,使用上表與字元重複次數(shù)相關的特殊符號,我們可以從
14、字串I like Chapter 2, Chapter 10, and Chapter 25 of this book!抓出Chapter 2、Chapter 10,以及Chapter 25 範例4-10: regExp08.m,string = I like Chapter 2, Chapter 10, and Chapter 25 of this book!; pattern = Chapter 1-90-9?; start, finish = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:length(st
15、art) fprintf(t%d: %sn, i, string(start(i):finish(i); end,回傳結(jié)果為:Matched substrings: 1: Chapter 2 2: Chapter 10 3: Chapter 25,.,20,字串的重複:信用卡號碼,若要抓出信用卡號碼,可見下列範例: 範例4-11: regExp12.m,string = My credit number is 1234-5678-9012-3456.; pattern = d4-d4-d4-d4; start, finish = regexp(string, pattern); fprintf
16、(Matched substrings:n); for i=1:length(start) fprintf(t%d: %sn, i, string(start(i):finish(i); end,Matched substrings: 1: 1234-5678-9012-3456,.,21,字串的重複:身份證字號,如果要比對身份證字號,可用下列範例: 範例4-12: regExp05.m 事實上,身份證字號本身就有內(nèi)在的編碼規(guī)則,這些規(guī)則和使用者的性別有關,還包含一個檢查碼,並非簡簡單單地由一個英文字母加上九個數(shù)字所構(gòu)成。,string = My Id number is F123765431
17、; pattern = A-Zd9; start = regexp(string, pattern),start = 17,.,22,字串的重複:特定樣式比對,若要在一個字串中,找出在 b 與 t 中間夾二或三個母音的子字串,可見下列範例: 範例4-13: regExp09.m,string = bt bat bet ban bit boat beet berp boaet baeiout; pattern = baeiou2,3t; start, finish = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:
18、length(start) fprintf(t%d: %sn, i, string(start(i):finish(i); end,Matched substrings: 1: boat 2: beet 3: boaet,.,23,字串的重複:小括弧的使用,我們也可以利用小刮號,進行重複字串的比對: 範例4-14: regExp18.m,string = Two cards: 1234-5678-9012-3456 and 0987-6543-2109-8765; pattern = (d4-)3d4; start, finish = regexp(string, pattern); fpri
19、ntf(Matched substrings:n); for i=1:length(start) fprintf(t%d: %sn, i, string(start(i):finish(i); end,Matched substrings: 1: 1234-5678-9012-3456 2: 0987-6543-2109-8765,.,24,字串的重複:比對原則,在通用式所採用的比對原則是最大比對(Maximal Match)或是貪心比對(Greedy Match),因此會盡量貪到越多的字元越好, 若使用通用式 foo.*bar 來比對字串 The food is under the bar
20、in the barn.,所比對到的是長字串 food is under the bar in the bar,而不是另一個符合比對標準的短字串 food is under the bar。 若要使通用式進行極小比對(Minimal Match),也就是在符合比對的條件下,選擇最短的字串,那麼就要在星號之後加上問號。,.,25,字串的重複:最大與最小比對,最大比對與最小比對的範例: 範例4-15: regExp19.m,string = The food is under the bar in the barn.; pattern1 = foo.*bar; start, finish = re
21、gexp(string, pattern1); fprintf(tGreedy match: %sn, string(start:finish); pattern2 = foo.*?bar; start, finish = regexp(string, pattern2); fprintf(tMinimal match: %sn, string(start:finish);,Greedy match: food is under the bar in the bar Minimal match: food is under the bar,.,26,字串的重複:問號的意義,請注意,問號在通用式
22、的意義是和內(nèi)文相關(Context Dependent)的,可以分兩類情況來說明: 如果問號接在一般字元之後,代表比對前一個字元零次或一次。 如果問號接在星號或加號之後,代表極小比對。,.,27,Open Question,如何在使用通用運算式時,一次找到所有可能的比對成功的子字串?,.,28,選項的使用:或的使用,如果同時比對數(shù)個通用式,可使用|來他們串起來,而達到或(OR)的邏輯運算效果。如,我們可同時比對信用卡號碼、身份證字號、電話號碼。 範例4-16: regExp16 .m,string = 1234-5678-9012-3456 and A123456789 and 5715131
23、; pattern = d4-d4-d4-d4|A-Zd9|d7; start, finish = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:length(start) fprintf(t%d: %sn, i, string(start(i):finish(i); end,回傳結(jié)果為:Matched substrings: 1: 1234-5678-9012-3456 2: A123456789 3: 5715131,.,29,小括弧用於或,若是要進行 OR 運算的通用式有共通的部分,我們就需要使用小括弧來進
24、行更明確的規(guī)範,例如下列範例,可以同時比對 Chapter 和 Section,以及後續(xù)的數(shù)字: 範例4-17: regExp17 .m,string = I like Chapter 12, particularly Section 4!; pattern = (Chapter|Section) 1-9d?; start, finish = regexp(string, pattern); fprintf(Matched substrings:n); for i=1:length(start) fprintf(t%d: %sn, i, string(start(i):finish(i); e
25、nd,Matched substrings: 1: Chapter 12 2: Section 4,.,30,小括?。夯貍鞅葘Ψ系淖执?小括弧還有一個重要的功能,就是可以將對應於小括弧的子字串傳回來,非常適用於特定子字串的抽取。 範例4-18: regExp20 .m,string = I bet there is a bat on the boat; pattern = b(w*)t; start, finish, token = regexp(string, pattern); fprintf(There are %d matched substrings:n, length(start
26、); for i=1:length(start) fprintf(t%d: matched=%s, token=%sn, i, string(start(i):finish(i), string(tokeni(1):tokeni(2); end,回傳結(jié)果為:There are 3 matched substrings: 1: matched=bet, token=e“ 2: matched=bat, token=a 3: matched=boat, token=oa 在上例中,token 就是由 b 和 t 所夾的字串。,.,31,小括?。撼槿【W(wǎng)頁連結(jié),我們可以利用小括弧抽取字串功能來抽取網(wǎng)頁
27、的連結(jié)網(wǎng)址和連結(jié)文字,這在網(wǎng)頁搜尋引擎的製作上,是一個很重要的步驟,因為網(wǎng)頁蒐集程式(又稱為 Robot 或 Crawler)將網(wǎng)頁抓回來後,就是根據(jù)網(wǎng)頁內(nèi)的連結(jié)網(wǎng)址,來決定下次要蒐集的網(wǎng)頁,如此依次(可根據(jù) Depth-first Search 或 Breadth-first Search)反覆蒐集,就可以抓到很多網(wǎng)頁。 使用類似的方法,也可以抽取網(wǎng)頁中的電子郵件帳號,燒成 DM 電郵光碟牟利!,.,32,網(wǎng)頁範例,網(wǎng)頁範例: regExp.htm, List of important links: : MathWorks. : Roger Jang. : Google. ,.,33,小括弧
28、:抽取連結(jié)的範例,利用 regexp 指令所傳回來的第三個輸出變數(shù),我們可以輕易地抓出此網(wǎng)頁的連結(jié)網(wǎng)址和連結(jié)文字: 範例4-20: linkExtraction .m,string = fileread(regExp.htm); pattern = (.*?); start, finish, token = regexp(string, pattern); fprintf(由檔案 %s 抽取出 %d 個連結(jié)::n, fileName, length(start); for i=1:length(start) fprintf(t%d: 連結(jié)文字:%s, 連結(jié)網(wǎng)址:%sn, i, string(t
29、okeni(2,1):tokeni(2,2), string(tokeni(1,1):tokeni(1,2); end,由檔案 regExp.htm 抽取出 3 個連結(jié):: 1: 連結(jié)文字:MathWorks, 連結(jié)網(wǎng)址:http:/ 2: 連結(jié)文字:Roger Jang, 連結(jié)網(wǎng)址:/jang 3: 連結(jié)文字:Google, 連結(jié)網(wǎng)址:http:/,.,34,字串的代換:基本範例,利用通用式來進行字串的代換,主要的指令是 regexprep。如,若要將所有b 和 t 中間至少夾一個母音的字串代換為 xxx。 範例4-21: regExpRep01 .m,str = I bet there is a bat in the boat!; pat = baeiou+t; newStr = regexprep(str, pat, xxx); fprintf(%sn, newStr);,回傳結(jié)果為: I xxx there is a xxx in the xxx!,.,35,字串的代換:壓縮空白,我們可將一列字串中,連續(xù)出現(xiàn)的多個空白字元,壓縮成一個空
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025某餐飲品牌特許加盟合同協(xié)議書范本
- 2025年二月份跨境獨立站運營借款協(xié)議GMV增長對賭協(xié)議
- 胸腔鏡手術病人的護理
- 超市員工管理規(guī)章制度
- 基于過盈聯(lián)接的機油泵襯套壓裝質(zhì)量監(jiān)控設計與應用
- 二零二五版收購企業(yè)合同范例
- 基金投資組合基金池
- 有關車位租賃合同范例
- 二零二五池塘承包合同范例
- 內(nèi)務管理制度500字
- 國防教育和兵役法
- 2025年服務器行業(yè)市場規(guī)模及主要企業(yè)市占率分析報告(智研咨詢發(fā)布)
- 2025年中國甲魚行業(yè)市場全景評估及發(fā)展戰(zhàn)略規(guī)劃報告
- 2025屆遼寧省名校聯(lián)盟高三一模地理試題(原卷版+解析版)
- 國家之間的合作發(fā)展-以“一帶一路”為例 課件 2024-2025學年高二下學期 地理 魯教版(2019)選擇性必修2
- Premiere視頻編輯案例教程(PremierePro2021)課件 第 6 章 字幕與字幕特效
- ESC急慢性心力衰竭診斷和治療指南
- 周日值班制度
- 2025保安證考試模擬試卷及答案
- 湖南水泥倉施工方案
- 肺栓塞的護理診斷及護理措施
評論
0/150
提交評論