正規表示式Regular Expression - 陳鍾誠的網站

文章推薦指數: 80 %
投票人數:10人

匹配輸入字串的開始位置。

如果設置了RegExp物件的Multiline屬性,^也匹配“\n”或“\r”之後的位置。

$, 匹配 ... Wikidot.com .wikidot.com Shareon Edit History Tags Source Explore»   陳鍾誠的網站 金門大學:免費電子書、教材、程式、動畫 文章列表 最近修改 所有網頁 標記 相關網站 陳鍾誠的網站 系統程式 C#程式設計 陳鍾誠 關於陳鍾誠 陳鍾誠的信箱 陳鍾誠的Facebook 陳鍾誠的網站 陳鍾誠的手機網 陳鍾誠的簡歷 陳鍾誠的Diigo 陳鍾誠的Youtube Wikidot 網站管理 本站成員 標記 加入本站? 頂欄 側欄 樣版 Wikidot文件 Wikidot語法 WikidotModule WikidotEmbedding WikidotTemplate WikidotLayout CreateaccountorSignin 課程 兩岸產業 網路資源 網路程式 開放原碼 動畫設計 研究專題 書籍 系統程式 C#程式設計 Blender動畫設計 作品 程式 論文 動畫 文章 新詩 故事 歷史 研究 研究 衛星遊戲 人工智慧 網路出版 機器翻譯 興趣 閱讀 寫作 影片 關注 學習 常用 生活 網站 手機版 手機最愛 Diigo Twitter Facebook Scribd Youtube Kmit ping GAE 金門不動產 手機入口網 大學課程網 rating: 0+x 正規表示式RegularExpression 作品 書籍 課程 程式集 小說集 論文集 散文集 影片集 編輯雜誌 程式人 電子書 JavaScript 計算語言學 微積分 Blender動畫 C#語言 系統程式 高等C語言 Java Android Verilog Wikidot R統計軟體 機率統計 計算機數學 組合語言 人工智慧 開放原始碼 網路資源運用 計算機結構 相關訊息 常用工具 友站連結 在家教育 RSS 最新修改 網頁列表 簡體版 English 文章 留言 授權 簡介 正規語法(RegularGrammar)是一種相當簡單的語法,這種語法被Perl語言成功的用於字串比對,接著成為重要的程式設計工具。

此種標準的正規語法後來被稱為正則表達式(RegularExpression)。

目前,大部分的語言都已納入正則表達式的函式庫,正則表達是可以說是程式設計師必定要瞭解的工具,也就是常識的一部分。

系統程式設計師更應該要瞭解正則表達式,因為正規語法是程式語言當中,用來描述基本詞彙(Vocabulary),並據以建構詞彙掃描器(Lexer)的基礎語法,Lexer是編譯器的基本元件之一。

假如我們要用正則表達式描述整數數字,那麼,可以用[0123456789]+這個表達式,其中的中括號[與]會框住一群字元,用來代表字元群,加號+所代表的是重複1次或以上,因此,該表達式就可以描述像3702451這樣的數字。

然而,在正則表達式中,為了更方便撰寫,於是允許用[0-9]+這樣的式子表達同樣的概念,其中的0-9其實就代表了0123456789等字元,這是一種簡便的縮寫法。

甚至,可以再度縮短後以[\d]+代表,其中的\d就代表數字所成的字元集合。

利用範例學習是理解正則表達式的有效方法,表格1就顯示了一些具有代表性的正則表達式範例。

表格1.正則表達式的範例 語法 正則表達式 範例 整數 [0-9]+ 3704 有小數點的實數 [0-9]+\.[0-9]+ 7.93 英文詞彙 [A-Za-z]+ Code 變數名稱 [A-Za-z_][A-Za-z0-9_]* _counter Email [a-zA-Z0-9_]+@[a-zA-Z0-9\._]+ wt.ude.timk|ccc#wt.ude.timk|ccc URL http://[a-zA-Z0-9\./_]+ http://ccc.kmit.edu.tw/mybook/ 為了協助讀者理解這些範例,我們有必要對範例中的一些正則表達式符號進行說明。

在實數的範例中,使用\.代表小數點符號.,不熟悉正則表達式的讀者一定覺得奇怪,為何要加上斜線符號\呢?這是因為在正則表達式當中,有許多符號具有特殊意義,例如點符號.是用來表示任意字元的,星號*是代表0次或以上,加號+代表一次或以上,在正則表達式當中,有許多這類的特殊字元,因此用斜線\代表跳出字元,就像C語言當中printf函數內的用途一樣。

因此,當我們看到\符號時,必須繼續向後看,才能知道其所代表的意義。

表格2列出了正則表達式當中大部份的重要符號之意義,以供讀者參考。

表格2.正則表達式當中的符號之意義 字元 描述 \ 將下一個字元標記為一個特殊字元、或一個原義字元、或一個向後引用、或一個八進制轉義符。

例如,“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]”的模式。

(pattern) 匹配pattern並獲取這一匹配。

所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。

要匹配圓括號字元,請使用“\(”或“\)”。

(?:pattern) 匹配pattern但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以後使用。

這在使用“或”字元(|)來組合一個模式的各個部分是很有用。

例如,“industr(?:y|ies)就是一個比”industry|industries'更簡略的運算式。

(?=pattern) 正向預查,在任何匹配pattern的字串開始處匹配查找字串。

這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。

例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。

預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字元之後開始。

(?!pattern) 負向預查,在任何不匹配pattern的字串開始處匹配查找字串。

這是一個非獲取匹配,也就是說,該匹配不需要獲取供以後使用。

例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

預查不消耗字元,也就是說,在一個匹配發生後,在最後一次匹配之後立即開始下一次匹配的搜索,而不是從包含預查的字元之後開始 x|y 匹配x或y。

例如,“z|food”能匹配“z”或“food”。

“(z|f)ood”則匹配“zood”或“food”。

[xyz] 字元集合。

匹配所包含的任意一個字元。

例如,“[abc]”可以匹配“plain”中的“a”。

[^xyz] 負值字元集合。

匹配未包含的任意字元。

例如,“[^abc]”可以匹配“plain”中的“p”。

[a-z] 字元範圍。

匹配指定範圍內的任意字元。

例如,“[a-z]”可以匹配“a”到“z”範圍內的任意小寫字母字元。

[^a-z] 負值字元範圍。

匹配任何不在指定範圍內的任意字元。

例如,“[^a-z]”可以匹配任何不在“a”到“z”範圍內的任意字元。

\b \B 匹配非單詞邊界。

“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。

\cx 匹配由x指明的控制字元。

例如,\cM匹配一個Control-M或回車符。

x的值必須為A-Z或a-z之一。

否則,將c視為一個原義的“c”字元。

\d 匹配一個數位字元。

等價於[0-9]。

\D 匹配一個非數位字元。

等價於[^0-9]。

\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。

\w 匹配包括底線的任何單詞字元。

等價於“[A-Za-z0-9_]”。

\W 匹配任何非單詞字元。

等價於“[^A-Za-z0-9_]”。

\xn 匹配n,其中n為十六進位轉義值。

十六進位轉義值必須為確定的兩個數位長。

例如,“\x41”匹配“A”。

“\x041”則等價於“\x04”&“1”。

規則運算式中可以使用ASCII編碼。

\num 匹配num,其中num是一個正整數。

對所獲取的匹配的引用。

例如,“(.)\1”匹配兩個連續的相同字元。

\n 標識一個八進制轉義值或一個向後引用。

如果\n之前至少n個獲取的子運算式,則n為向後引用。

否則,如果n為八進位數字(0-7),則n為一個八進制轉義值。

\nm 標識一個八進制轉義值或一個向後引用。

如果\nm之前至少有nm個獲得子運算式,則nm為向後引用。

如果\nm之前至少有n個獲取,則n為一個後跟文字m的向後引用。

如果前面的條件都不滿足,若n和m均為八進位數字(0-7),則\nm將匹配八進制轉義值nm。

\nml 如果n為八進位數字(0-3),且m和l均為八進位數字(0-7),則匹配八進制轉義值nml。

\un 匹配n,其中n是一個用四個十六進位數位表示的Unicode字元。

例如,\u00A9匹配版權符號(©)。

正則表達式在許多語言當中(像是Java,C#,Ruby,Python等)都已經有支援良好的函式庫,然而,在標準C語言的函式庫當中卻沒有這方面的函數,因此,我們使用C#這個語言說明正則表達式的用法。

範例1.在C#語言當中使用正則表達式進行樣式抽取的程式範例 usingSystem; usingSystem.Collections.Generic; usingSystem.Text.RegularExpressions; publicclassRegexp { //測試主程式 staticvoidMain(string[]args) { Listlist=Regexp.matches(@"32.4+56.7is89.1",@"[0-9]+\.[0-9]+",0); foreach(Stringtokeninlist) Console.WriteLine(token); } //傳回text中符合正規表示式pattern的所有段落。

publicstaticListmatches(Stringtext,Stringpattern,intgroupId) { ListrzList=newList(); Matchmatch=Regex.Match(text,pattern); for(inti=0;match.Success;i++) { rzList.Add(match.Groups[groupId].Value); match=match.NextMatch(); } returnrzList; } } 執行結果 D:\ExampleCode>cscRegexp.cs Microsoft(R)VisualC#2008Compilerversion3.5.21022.8 forMicrosoft(R).NETFrameworkversion3.5 Copyright(C)MicrosoftCorporation.Allrightsreserved. D:\ExampleCode>Regexp 32.4 56.7 89.1 參考文獻 資料來源:張智星的網站-正規表示式 正規表示式說明及範例比對不成立之字串 /a/含字母“a”的字串,例如“ab”,“bac”,“cba”“xyz” /a./含字母“a”以及其後任一個字元的字串,例如“ab”,“bac”(若要比對.,請使用\.)“a”,“ba” /^xy/以“xy”開始的字串,例如“xyz”,“xyab”(若要比對^,請使用\^)“axy”,“bxy” /xy$/以“xy”結尾的字串,例如“axy”,“abxy”以“xy”結尾的字串,例如“axy”,“abxy”(若要比對$,請使用\$)“xya”,“xyb” [13579]包含“1〃或“3〃或“5〃或“7〃或“9〃的字串,例如:”a3b”,“1xy”“y2k” [0-9]含數字之字串不含數字之字串 [a-z0-9]含數字或小寫字母之字串不含數字及小寫字母之字串 [a-zA-Z0-9]含數字或字母之字串不含數字及字母之字串 b[aeiou]t“bat”,“bet”,“bit”,“bot”,“but”“bxt”,“bzt” [^0-9]不含數字之字串(若要比對^,請使用\^)含數字之字串 [^aeiouAEIOU]不含母音之字串(若要比對^,請使用\^)含母音之字串 [^\^]不含“^”之字串,例如“xyz”,“abc”“xy^”,“a^bc” . 正規表示式的特定字元說明等效的正規表示式 \d數字[0-9] \D非數字[^0-9] \w數字、字母、底線[a-zA-Z0-9_] \W非\w[^a-zA-Z0-9_] \s空白字元[\r\t\n\f] \S非空白字元[^\r\t\n\f] . 正規表示式說明 /a?/零或一個a(若要比對?字元,請使用\?) /a+/一或多個a(若要比對+字元,請使用\+) /a*/零或多個a(若要比對*字元,請使用\*) /a{4}/四個a /a{5,10}/五至十個a /a{5,}/至少五個a /a{,3}/至多三個a /a.{5}b/a和b中間夾五個(非換行)字元 . 字元說明簡單範例 \避開特殊字元/A\*/可用於比對“A*”,其中*是一個特殊字元,為避開其特殊意義,所以必須加上“\” ^比對輸入列的啟始位置/^A/可比對“Abcd”中的“A”,但不可比對“aAb” $比對輸入列的結束位置/A$/可比對“bcdA”中的“A”,但不可比對“aAb” *比對前一個字元零次或更多次/bo*/可比對“Goodboook”中的“booo”,亦可比對“Goodbk”中的“b” +比對前一個字元一次或更多次,等效於{1,}/a+/可比對“caaandy”中的“aaa”,但不可比對“cndy” ?比對前一個字元零次或一次/e?l/可比對“angel”中的“el”,也可以比對“angle”中的“l” .比對任何一個字元(但換行符號不算)/.n/可比對“nay,anappleisonthetree”中的“an”和“on”,但不可比對“nay” (x)比對x並將符合的部分存入一個變數/(a*)and(b*)/可比對“aaaandbb”中的“aaa”和“bb”,並將這兩個比對得到的字串設定至變數RegExp.$1和RegExp.$2。

xy比對x或y/a*b*/g可比對“aaaandbb”中的“aaa”和“bb” {n}比對前一個字元n次,n為一個正整數/a{3}/可比對“lllaaalaa”其中的“aaa”,但不可比對“aa” {n,}比對前一個字元至少n次,n為一個正整數/a{3,}/可比對“aaaaaaaaa”其中的“aaa”及“aaaa”,但不可比對“aa” {n,m}比對前一個字元至少n次,至多m次,m、n均為正整數/a{3,4}/可比對“aaaaaaaaaaaaaa”其中的“aaa”及“aaaa”,但不可比對“aa”及“aaaaa” [xyz]比對中括弧內的任一個字元/[ecm]/可比對“welcome”中的“e”或“c”或“m” [^xyz]比對不在中括弧內出現的任一個字元/[^ecm]/可比對“welcome”中的“w”、”l”、”o”,可見出其與[xyz]功能相反。

(同時請注意/^/與[^]之間功能的不同。

) [\b]比對退位字元(Backspacecharacter)可以比對一個backspace,也請注意[\b]與\b之間的差別 \b比對英文字的邊界,例如空格例如/\bn\w/可以比對“noonday”中的‘no’; /\wy\b/可比對“possiblyyesterday.”中的‘ly’ \B比對非「英文字的邊界」例如,/\w\Bn/可以比對“noonday”中的‘on’, 另外/y\B\w/可以比對“possiblyyesterday.”中的‘ye’ \cX比對控制字元(Controlcharacter),其中X是一個控制字元/\cM/可以比對一個字串中的control-M \d比對任一個數字,等效於[0-9]/[\d]/可比對由“0〃至“9〃的任一數字但其餘如字母等就不可比對 \D比對任一個非數字,等效於[^0-9]/[\D]/可比對“w”“a”⋯但不可比對如“7〃“1〃等數字 \f比對form-feed若是在文字中有發生“換頁”的行為則可以比對成功 \n比對換行符號若是在文字中有發生“換行”的行為則可以比對成功 \r比對carriagereturn \s比對任一個空白字元(Whitespacecharacter),等效於[\f\n\r\t\v]/\s\w*/可比對“Ab”中的“b” \S比對任一個非空白字元,等效於[^\f\n\r\t\v]/\S/\w*可比對“Ab”中的“A” \t比對定位字元(Tab) \v比對垂直定位字元(Verticaltab) \w比對數字字母字元(Alphanumericalcharacters)或底線字母(”_”),等效於[A-Za-z0-9_]/\w/可比對“.A_!9〃中的“A”、”_”、”9〃。

\W比對非「數字字母字元或底線字母」,等效於[^A-Za-z0-9_]/\W/可比對“.A_!9〃中的“.”、”“、”!”,可見其功能與/\w/恰好相反。

\ooctal比對八進位,其中octal是八進位數目/\oocetal123/可比對與八進位的ASCII中“123〃所相對應的字元值。

\xhex比對十六進位,其中hex是十六進位數目/\xhex38/可比對與16進位的ASCII中“38〃所相對應的字元。

Facebook Facebook Wikidot ShowComments AddaNewComment Postpreview: Closepreview orSigninasWikidotuser (willnotbepublished) - + Help:wikitextquickreference PermanentLink Edit Delete 本網頁的作者、授權與引用方式 作者 陳鍾誠,於金門大學資訊工程系,電子郵件:wt.ude.uqn|ccc#wt.ude.uqn|ccc,網站:http://ccckmit.wikidot.com。

授權 本文採用創作共用(CreativeCommon)3.0版的姓名標示─非商業性─相同方式分享授權條款,歡迎轉載或修改使用,但若做為商業使用時必須取得授權,引用本文時請參考下列格式。

中文版(APA格式) 陳鍾誠(23Dec200900:43),(網頁標題)正規表示式RegularExpression,(網站標題)陳鍾誠的網站,取自http://ccckmit.wikidot.com/regularexpression,網頁修改第4版。

English(APAformat) Chung-ChenChen(23Dec200900:43),Retrievedfromhttp://ccckmit.wikidot.com/regularexpression,Pagerevision4. pagerevision:4,lastedited:14Jan201007:03 Edit Rate(0) Tags Discuss(0) History Files Print Sitetools + Options EditSections Append EditMeta Watchers Backlinks PageSource Parent LockPage Rename Delete Help  | TermsofService  | Privacy  | Reportabug  | Flagasobjectionable PoweredbyWikidot.com Unlessotherwisestated,thecontentofthispageislicensedunderCreativeCommonsAttribution-NonCommercial-ShareAlike3.0License Otherinterestingsites UNAS-F Understand,Nullify,Annex. Rhye'sofWiki WikiforRhye'smodsandgeneralawesomeness FrontmanWiki ISTAR InternationalSocietyforTestateAmoebaResearch Clickheretoeditcontentsofthispage. Clickheretotoggleeditingofindividualsectionsofthepage(ifpossible).Watchheadingsforan"edit"linkwhenavailable. Appendcontentwithouteditingthewholepagesource. Checkouthowthispagehasevolvedinthepast. Ifyouwanttodiscusscontentsofthispage-thisistheeasiestwaytodoit. Viewandmanagefileattachmentsforthispage. AfewusefultoolstomanagethisSite. Seepagesthatlinktoandincludethispage. Changethename(alsoURLaddress,possiblythecategory)ofthepage. Viewwikisourceforthispagewithoutediting. View/setparentpage(usedforcreatingbreadcrumbsandstructuredlayout). Notifyadministratorsifthereisobjectionablecontentinthispage. Somethingdoesnotworkasexpected?Findoutwhatyoucando. GeneralWikidot.comdocumentationandhelpsection. Wikidot.comTermsofService-whatyoucan,whatyoushouldnotetc. Wikidot.comPrivacyPolicy.



請為這篇文章評分?