正規表示式Regular Expression - Poy Chang

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

正規表示式可以幫助我們快速找到符合文字模式的字串,但執行效率未必”快速”,不精確的寫法還是很容易造成效能低落的問題。

以C# 為例,有幾個提升效率的注意事項:. 能使用 ... Togglenavigation PoyChang Home About Categories Home About Categories List OnGitHub TopofPage TrialandError About Categories List Feed RecentPosts 19May» 不使用第三方套件來序列化/反序列化JSON物件 26Apr» 在TeamsWebhook訊息中@標註某個人或頻道 25Apr» 使用AdaptiveCards發送訊息到MicrosoftTeamsWebhook 22Apr» 使用QRCode發送簡訊、加入Wi-Fi、遞名片 11Apr» 讓GitHubPages能支援不區分大小寫網址的能力 01Apr» 輸出.NET專案檔的變數訊息 21Mar» 程式設計師的誓言 11Mar» 在AzureDevOpsPipelines中輸出有顏色的Log訊息 14Jan» 如何手動下載WindowsUpdate安裝檔 05Jan» 開發多個.NET目標框架的NuGet套件 MicrosoftMVP2018-2021 STUDY4 AngularTaiwan 正規表示式RegularExpression January 1st, 1970 正規表示式通常被稱為一個模式(pattern),為用來描述或者符合一系列符合某個句法規則的字串,透過他我們可以快速搜尋符合指定模式的文字。

工具網站 iHateRegex查詢常用的正規表示式 RegExr-RegularExpressionOnline線上測試正規表示式 JavaScriptRegularExpressionVisualizer視覺化呈現正規表示式的規則路徑 效能 正規表示式可以幫助我們快速找到符合文字模式的字串,但執行效率未必”快速”,不精確的寫法還是很容易造成效能低落的問題。

以C#為例,有幾個提升效率的注意事項: 能使用靜態全域變數時盡量用 如下寫法,透過設定RegexOptions.Compiled可將該正規表達式編譯並成程式集,這設定雖然會增加啟動時間,但重複使用時,會有更好的執行速度。

readonlystaticRegexregex=newRegex("[ABC]",RegexOptions.Compiled); 另外還有一些設定項,可以參考看看,但不確定是否影響執行速度: RegexOptions.IgnoreCase不區分大小寫,只限用在英文字 RegexOptions.Multiline多行模式 RegexOptions.Singleline單行模式 小技巧 善用^標示起始位置,如Regex("^Abc")只會找Abc開頭的字串,而aAbc就忽略 善用\b偵測字元邊界,和^意思很類似 善用.*?忽略後續字串,如Regex("^A.*?")只比對字串第一個字是否為A,後面忽略 正規表示式說明 正規表示式 說明及範例 比對不成立之字串 /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”所相對應的字元。

?: 不予擷取的群組,括號括住的部份不列入Group中 (a(b*))+會有Group#1和Group#2但是(a(?:b*))+只會有Group#1一個群組 REF: 不予擷取的群組 常用範例 IPv4 /^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$/ MAC _IEEE802MAC-48標準格式 _6組由:或-做區隔的雙位數16進制數字 /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/ 驗證使用者帳號,第一個字不為數字,只接受大小寫字母、數字及底線 /^[a-zA-Z]\w*$/ 密碼 _高強度密碼,6位數以上,並且至少包含大寫字母、小寫字母、數字、符號各一 _若需要調整,將其對應的小括號內容拿掉即可 /^(?=.*[^a-zA-Z0-9])(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{6,}$/ 電子郵件,以下的範例並沒有相容RFC5322規範,但是已經可以驗證大多數的電子郵件 /^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$/ URL網址,允許http,https,ftp協定,並且可取出Protocol,Domain,Path,Query /^(?:(https?|ftp):\/\/)?((?:[a-zA-Z0-9.\-]+\.)+(?:[a-zA-Z0-9]{2,4}))((?:/[\w+=%&.~\-]*)*)\??([\w+=%&.~\-]*)$/ 主流信用卡 /^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|622((12[6-9]|1[3-9][0-9])|([2-8][0-9][0-9])|(9(([0-1][0-9])|(2[0-5]))))[0-9]{10}|64[4-9][0-9]{13}|65[0-9]{14}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})*$/ 美國運通信用卡 /^(3[47][0-9]{13})*$/ MasterCard /^(5[1-5][0-9]{14})*$/ Visa卡 /^(4[0-9]{12}(?:[0-9]{3})?)*$/ 日期(MM/DD/YYYY) /^((0?[1-9]|1[012])[-/.](0?[1-9]|[12][0-9]|3[01])[-/.](19|20)?[0-9]{2})*$/ 日期(YYYY/MM/DD) /^(((?:19|20)[0-9]{2})[-/.](0?[1-9]|1[012])[-/.](0?[1-9]|[12][0-9]|3[01]))*$/ 台灣手機號碼 /^09\d{2}-?\d{3}-?\d{3}$/ 中文(Unicode) [\u4e00-\u9fa5] 簡易驗證台灣身份證,仍然需要一些進階的檢查,如驗證檢查碼,或前往內政部戶政司驗證 /^[A-Za-z][1-2]\d{8}$/ 正整數 /^\+?\d+$/ 整數 /^[+-]?\d+$/ float /^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$/ 參考資料: RegExr-RegularExpressionOnline 就是愛程式-正規表示式RegularExpression ASinglePagePerlRegularExpressionQuickReference Whatspecialcharactersmustbeescapedinregularexpressions? JavaScriptRegularExpressionVisualizer iHateRegex Note(41) SharePost Twitter Facebook Google+ PoyChang TrialandError ←Previous Next→



請為這篇文章評分?