正規表示式Regular Expression - 陳鍾誠的網站
文章推薦指數: 80 %
匹配輸入字串的開始位置。
如果設置了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)
{
List
publicstaticList
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.
延伸文章資訊
- 1簡易Regular Expression 入門指南
前陣子看到了這個寫得很棒又很漂亮的教學:Regular Expressions for Regular Folk,再加上之前一直沒有在自己的課程裡面教到Reglar Expresioon,可是 ...
- 2Regular Expression (regex),要成為GA專家一定要懂的正規 ...
學會使用正規表示式,或稱規則運算式(Regular Expression, RegEx) 就很重要了!常見的規則運算式符號 ... Google Analytics (GA) 實用教學,快速掌握...
- 3【教學】正規表示式Regular Expression 語法規則
【教學】正規表示式Regular Expression 語法規則. 正規表示式,又名正規表示法、常規表示法、規則運算式,它常用於比對字串,語法只要看懂後其實非常 ...
- 4十五分鐘認識正規表達式,解決所有文字難題
正規表達式(Regular Expression),是一種用來描述字串 符合某個語法規則 的模型(pattern),可以用來做文字的搜尋、比對、萃取、替代、轉換等等,在 ...
- 5Regex 教學- 正規表示法教學Regular Expression Tutorial
正規表示法(Regex) 是用來處理字串的方法,Regex 用自己一套特殊的符號表示法,讓我們可以很方便的搜尋字串、取代字串、刪除字串或測試字串是否符合樣式 ...