MATLAB程式設(shè)計(jì)進(jìn)階篇通用運(yùn)算式_第1頁
MATLAB程式設(shè)計(jì)進(jìn)階篇通用運(yùn)算式_第2頁
MATLAB程式設(shè)計(jì)進(jìn)階篇通用運(yùn)算式_第3頁
MATLAB程式設(shè)計(jì)進(jìn)階篇通用運(yùn)算式_第4頁
MATLAB程式設(shè)計(jì)進(jìn)階篇通用運(yùn)算式_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、.,1,MATLAB 程式設(shè)計(jì):進(jìn)階篇通用運(yùn)算式,.,2,基本介紹:UNIX淵源,早期的電腦作業(yè)系統(tǒng)(例如 UNIX 系統(tǒng))都是以文字為介面,因此對於文字的處理與運(yùn)算也就有一套特別精心規(guī)劃的方式,其中最為人所津津樂道的產(chǎn)出,就是通用運(yùn)算式(Regular Expressions)的制訂和其廣泛的應(yīng)用。 通用運(yùn)算式最早出現(xiàn)在 UNIX 的文字編輯程式,例如 ed、vi 、emacs ,也常被用在以 UNIX 為基礎(chǔ)的程式語言,例如 Perl 等。近年來在 Web 上使用的 JavaScript 以及 VBScript 也加入了通用運(yùn)算式的功能。,.,3,基本介紹:通用性,如果照字面來翻譯,Reg

2、ular Expressions 應(yīng)該是翻成正規(guī)運(yùn)算式,但我們採取的中文名稱是通用運(yùn)算式或簡稱通用式,強(qiáng)調(diào)此方法能由簡單的符號來代表複雜的字串的特性 在本章所學(xué)習(xí)到的通用運(yùn)算式,幾乎可以原封不動地搬到其他程式語言來使用,例如 JavaScript、C 、 Python、Perl、VBScript 等等。 MATLAB 6.x 的通用運(yùn)算式並不支援中文,但在7.x 已經(jīng)可以完全支援中文了!,.,4,基本介紹:終極目標(biāo),你已經(jīng)在用通用式的概念了!看看你常用到的萬用符號(Wildcards characters): dir *.txt dir data?.txt 終極目標(biāo) 用簡單的符號來代表複雜的字

3、串,以便進(jìn)行特定字串的比對、抽取及代換,.,5,基本用法:尋找字串開始位置,使用 regexp 指令比對字串,可找出某一個(gè)特定型態(tài)的字串在另一個(gè)字串的出現(xiàn)位置。 例如,如果要找出love在一個(gè)字串Love me tender, love me sweet, never let me go出現(xiàn)的位置,可用下列程式碼: 範(fà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,基本用法:大小寫均可,若要進(jìn)行大小寫均可(Ignore Cases)的比對,則可以使用 regexpi 指令 : 範(fàn)例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í),多加一個(gè)輸出變數(shù): 範(fàn)例4-3: regExp03.m 回傳結(jié)果為: start =6 22 42 finish =7 23 43 其中 start 和 finish 代表所比對到的三個(gè)me的開始和結(jié)束位置。,string = Love me tender, love me sweet, never let me go; pattern = me; start, finish = regexp(string, pattern),.,8,方括弧:列舉欲比對字元,我們可以使用方括?。ǎ﹣砹信e所要比對的字元,可見下

6、列範(fàn)例: 範(fàn)例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,方括弧:使用範(fàn)圍符號,若是連續(xù)字

7、母或數(shù)字,就可以使用範(fàn)圍符號-來簡化方括弧中的列舉字元。例如, 數(shù)字 0 到 9,可以寫成 0123456789,或是簡化寫成 0-9。 26 個(gè)小寫英文字母可以簡化寫成 a-z 。 26 個(gè)大寫英文字母可以簡化寫成 A-Z。 英文字母:a-zA-Z 數(shù)字或英文字母:0-9a-zA-Z,.,10,方括?。簲?shù)字範(fàn)圍,例如若要比對西元年份,可見下列範(fàn)例: 範(fàn)例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,向量化的輸入和輸出,事實(shí)上,regexp 指令也可以接收向量化的輸入,並產(chǎn)生向量化的輸出,例如: 範(fà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,方括?。汗?fàn)例列表,有關(guān)方括弧的使用,列表整理如下:,像不像表情符號?,.,13,特定字元:列表,有些通用式會常被用到,因此已被定義為特定字元,以簡化整體通用式,這些字元列表說明如下:,若是針對中文

10、,可以加上全型空白。,.,14,特定字元:比對數(shù)字,我們可以用d來比對由 0 到 9 的數(shù)字,並用D來比對非數(shù)字。假設(shè)我們要找出兩個(gè)非數(shù)字夾一個(gè)數(shù)字的子字串,可使用DdD。 範(fàn)例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,特定字元:句點(diǎn)的使用,我們也可以抓出來兩個(gè) t 中間夾 4 個(gè)任意字元的子字串,請見下例範(fàn)例: 範(fàn)例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,定位符號:句首和句尾,在通用式裡,最常用的定位符號就是 和 $,其中 代表一個(gè)字串的開始位置,因此 xy 代表以 xy 開始的字串;而 $ 代表一個(gè)字串的結(jié)束位置,因此 xy$ 代表以 xy 結(jié)束的字串。 範(fàn)例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,字串的重複:範(fàn)例列表,我們也可定義字元的重複次數(shù),整理如下:,.,19,字串的重複:基本範(fàn)例,使用上表與字元重複次數(shù)相關(guān)的特殊符號,我們可以從

14、字串I like Chapter 2, Chapter 10, and Chapter 25 of this book!抓出Chapter 2、Chapter 10,以及Chapter 25 範(fàn)例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,字串的重複:信用卡號碼,若要抓出信用卡號碼,可見下列範(fàn)例: 範(fàn)例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,字串的重複:身份證字號,如果要比對身份證字號,可用下列範(fàn)例: 範(fàn)例4-12: regExp05.m 事實(shí)上,身份證字號本身就有內(nèi)在的編碼規(guī)則,這些規(guī)則和使用者的性別有關(guān),還包含一個(gè)檢查碼,並非簡簡單單地由一個(gè)英文字母加上九個(gè)數(shù)字所構(gòu)成。,string = My Id number is F123765431

17、; pattern = A-Zd9; start = regexp(string, pattern),start = 17,.,22,字串的重複:特定樣式比對,若要在一個(gè)字串中,找出在 b 與 t 中間夾二或三個(gè)母音的子字串,可見下列範(fàn)例: 範(fàn)例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,字串的重複:小括弧的使用,我們也可以利用小刮號,進(jìn)行重複字串的比對: 範(fàn)例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,而不是另一個(gè)符合比對標(biāo)準(zhǔn)的短字串 food is under the bar。 若要使通用式進(jìn)行極小比對(Minimal Match),也就是在符合比對的條件下,選擇最短的字串,那麼就要在星號之後加上問號。,.,25,字串的重複:最大與最小比對,最大比對與最小比對的範(fàn)例: 範(fàn)例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)文相關(guān)(Context Dependent)的,可以分兩類情況來說明: 如果問號接在一般字元之後,代表比對前一個(gè)字元零次或一次。 如果問號接在星號或加號之後,代表極小比對。,.,27,Open Question,如何在使用通用運(yùn)算式時(shí),一次找到所有可能的比對成功的子字串?,.,28,選項(xiàng)的使用:或的使用,如果同時(shí)比對數(shù)個(gè)通用式,可使用|來他們串起來,而達(dá)到或(OR)的邏輯運(yùn)算效果。如,我們可同時(shí)比對信用卡號碼、身份證字號、電話號碼。 範(fàn)例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,小括弧用於或,若是要進(jìn)行 OR 運(yùn)算的通用式有共通的部分,我們就需要使用小括弧來進(jìn)

24、行更明確的規(guī)範(fàn),例如下列範(fàn)例,可以同時(shí)比對 Chapter 和 Section,以及後續(xù)的數(shù)字: 範(fàn)例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,小括弧:回傳比對符合的字串,小括弧還有一個(gè)重要的功能,就是可以將對應(yīng)於小括弧的子字串傳回來,非常適用於特定子字串的抽取。 範(fàn)例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)頁搜尋引擎的製作上,是一個(gè)很重要的步驟,因?yàn)榫W(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)頁範(fàn)例,網(wǎng)頁範(fàn)例: regExp.htm, List of important links: : MathWorks. : Roger Jang. : Google. ,.,33,小括弧

28、:抽取連結(jié)的範(fàn)例,利用 regexp 指令所傳回來的第三個(gè)輸出變數(shù),我們可以輕易地抓出此網(wǎng)頁的連結(jié)網(wǎng)址和連結(jié)文字: 範(fàn)例4-20: linkExtraction .m,string = fileread(regExp.htm); pattern = (.*?); start, finish, token = regexp(string, pattern); fprintf(由檔案 %s 抽取出 %d 個(gè)連結(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 個(gè)連結(jié):: 1: 連結(jié)文字:MathWorks, 連結(jié)網(wǎng)址:http:/ 2: 連結(jié)文字:Roger Jang, 連結(jié)網(wǎng)址:/jang 3: 連結(jié)文字:Google, 連結(jié)網(wǎng)址:http:/,.,34,字串的代換:基本範(fàn)例,利用通用式來進(jìn)行字串的代換,主要的指令是 regexprep。如,若要將所有b 和 t 中間至少夾一個(gè)母音的字串代換為 xxx。 範(fàn)例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)的多個(gè)空白字元,壓縮成一個(gè)空

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論