正則表示式（，常簡寫為、或），又稱規律表示式、正規 zhcn 表示式；zhtw 表示式；zhhk 表示式；、正規表示法、規則運算式、常規表示法，是計算機科學概念，用簡單字串來描述、匹配文中全部符合指定格式的字串，現在很多文字編輯器都支援用正則表示式搜尋、取代符合指定格式的字串。 許多程式設計語言都支援用正則表示式操作字串，如 Perl 就內建功能強大的正則表示式引擎。正則表示式這概念最初由 Unix 的工具軟體（例如 sed 和 grep）普及開。 譯名問題 描述字串規律的表示式原應順理成章稱為規律表示式（pattern expression／rule expression），但卻叫成有欠準確的 regular expression，導致現在有多種中譯名，如將 regular 譯成規律、規則、zhcn 正規；zhtw 正則；zhhk 正規；、正則或常規，將 expression 譯成表示式、zhcn 表示式；zhtw 表示式；zhhk 表示式；、表示法或運算式等。 歷史 最初的正則表示式出現於理論計算機科學的自動控制理論和形式化語言理論中。在這些領域中有對計算（自動控制）的模型和對形式化語言描述與分類的研究。 1940 年，沃倫麥卡洛克與沃爾特皮茨將神經系統中的神經元描述成小而簡單的自動控制元。 1950 年代，數學家斯蒂芬科爾克萊尼利用稱之為「正則集合」的數學符號來描述此模型。肯湯普遜將此符號系統引入編輯器，隨後是 Unix 上的編輯器 ed，並最終引入 grep。自此以後，正則表示式被廣泛地應用於各種或類 Unix 系統的工具中。正則表示式的規範，分為基本型正則表示式（，）和擴充套件型正則表示式（，）兩大流派。在相容的系統上，和之類的工具都遵循規範，一些資料庫系統中的正則表示式也符合規範。、、都屬於，是歷史最早的正則表示式，因此元字元必須轉譯之後才具有特殊含義。、則屬於，元字元不用轉譯。 的正則表示式源自於於 1986 年 1 月 19 日釋出的，它已經演化成了（相容正則表示式，），一個由開發的，為很多現代工具所使用的庫。 各程式語言之間關於正則表示式的整合，目前開發進展得很差。的子專案的設計中已考慮到了這點。 理論 正則表示式可以用形式化語言理論的方式來表達。正則表示式由常量和運算元組成，它們分別表示字串的集合和在這些集合上的運算。給定有限字母表 Σ 定義了下列常量： 空集 varnothing 表示集合 varnothing。 空串 varepsilon 表示僅包含一個 不含任何字元、長度為 0 的字串 的集合。 ainSigma 表示僅包含一個元素 a 的集合 a。 定義了下列運算： 串接 RS 表示集合 alpha beta mid alpha in R beta in S，這裡的 alpha beta 表示將 alpha 和 beta 兩個字串按順序連線。例如：ab cd ef abd abef cd cef。 選擇 R S 表示 R 和 S 的並集。例如：ab c ab d ef ab c d ef。 克萊尼 Kleene 星號 R 表示包含 varepsilon 且在字串串接運算下閉合的 R 的最小超集。這是可以透過 R 中零或有限個字串的串接得到所有字串的集合。例如：ab c varepsilon ab c abab abc cab cc ababab cdots 。 上述常量和運算元形成了克萊尼代數。 很多課本使用對選擇使用符號 cup、 或 vee 替代豎線。 為了避免括號，假定星號有最高優先順序，接著是串接，接著是並集。如果沒有歧義則可以省略括號。例如：ab c 可以寫為 abc，而 ab c 可以寫為 abc。 例子： ab 表示 varepsilon a b bb bbb cdots 。 ab 表示包括空串和任意數目個 a 或 b 字元組成的所有字串的集合：varepsilon a b aa ab ba bb aaa cdots 。 abcε 表示開始於一個 a 接著零或多個 b 和最後一個可選的 c 組成的字串的集合：a ac ab abc abb abbc cdots 。 為了使表示式更簡潔，正則表示式也定義了？和 ；aa 等於 a，表示 a 出現至少一次；而 aε 等於 a，表示 a 出現 1 次或不出現。有的定義中增加了補運算元 sim；sim R 表示在 Sigma 上但不在 R 中的所有字串的集合。補運算元在理論上並非必要，因為它可以使用其他運算元來表達，但它可以使一些表示式變得更加簡潔。 這種意義上的正則表示式可以表達正則語言，是可被有限狀態自動機精確接受的語言類。但是在簡潔性上有重要區別。某類正則語言只能用大小指數增長的自動機來描述，而要求的正則表示式的長度只線性的增長。 正則表示式對應於喬姆斯基層級的型別 3 文法。但通常程式語言或其相關庫（例如 PCRE）中實現的正則表示式的表達能力是喬姆斯基層級中型別 3 文法的超集。在另一方面，在正則表示式和不導致這種大小上的爆炸的非確定有限狀態自動機之間有簡單的對映；為此經常被用作正則表示式的替表示式。 這種形式化中存在著冗餘，典型的體現是存在不同的正則表示式可以表達同樣的語言。有可能對兩個給定正則表示式寫一個演算法來判定它們所描述的語言是否本質上相等，即簡約每個表示式到極小確定有限自動機，確定它們是否同構（等價）。這種冗餘可以消減到什麼程度？我們可以找到仍有完全表達力的正則表示式的有趣的子集嗎？這提出了一個令人驚奇的困難問題。Kleene 星號和並集明顯是需要的，但是我們或許可以限制它們的使用。由於正則表示式如此簡單，沒有辦法在語法上把它重寫成某種規範形式。過去公理化的缺乏導致了。最近用克萊尼代數公理化了正則表示式。 很多現實世界的 正則表示式 引擎實現了不能用正則表示式代數表達的特徵。 基本語法 一個正則表示式通常被稱為一個模式，為用來描述或者匹配一系列符合某個句法規則的字串。例如：Handel、Händel 和 Haendel 這三個字串，都可以由 H aäae ndel 這個模式來描述。大部分正則表示式的形式都有如下的結構： 選擇 豎線 代表選擇（即或集），具有最低優先順序。例如 graygrey 可以匹配或。 數量限定 某個字元後的數量限定符用來限定前面這個字元允許出現的個數。最常見的數量限定符包括 、 和 （不加數量限定則代表出現一次且僅出現一次）： 加號 代表前面的字元必須至少出現一次。（1 次或多次）。例如，google 可以匹配 google、gooogle、goooogle 等； 問號？代表前面的字元最多隻可以出現一次。（0 次或 1 次）。例如，colour 可以匹配 color 或者 colour； 星號 代表前面的字元可以不出現，也可以出現一次或者多次。（0 次、1 次或多次）。例如，042 可以匹配 42、042、0042、00042 等。 匹配 圓括號 可以用來定義運算子的範圍和優先度。例如，gr ae y 等價於 graygrey，grandfather 匹配 father 和 grandfather。 上述這些構造子都可以自由組合，因此 H aeä ndel 和 H aaeä ndel 是相同的，表示 Handel Haendel Händel。 精確的語法可能因不同的工具或程式而異。 PCRE 表示式全集 正則表示式有多種不同的風格。下表是在中元字元及其在正則表示式上下文中的行為的一個完整列表，適用於或者程式語言（或者的正則表示式文法是的子集）： 字元 描述 」共計 12 個）、或一個向後引用、或一個八進位制轉義符。例如，「n」匹配字元「n」。「n」匹配一個換行符。序列「」匹配「」而「」則匹配「」。 匹配輸入字串的開始位置。如果設定了物件的屬性， 也匹配「n」或「r」之後的位置。 匹配輸入字串的結束位置。如果設定了物件的屬性， 也匹配「n」或「r」之前的位置。 匹配前面的子表示式零次或多次。例如，zo 能匹配「z」、「zo」以及「zoo」。 等價於 0。 匹配前面的子表示式一次或多次。例如，「zo」能匹配「zo」以及「zoo」，但不能匹配「z」。 等價於 1。 匹配前面的子表示式零次或一次。例如，「do es」可以匹配「does」中的「do」和「does」。 等價於 01。 n n 是一個非負整數。匹配確定的 n 次。例如，「o 2」不能匹配「Bob」中的「o」，但是能匹配「food」中的兩個 o。 n n 是一個非負整數。至少匹配 n 次。例如，「o 2」不能匹配「Bob」中的「o」，但能匹配「foooood」中的所有 o。「o 1」等價於「o」。「o 0」則等價於「o」。 nm m 和 n 均為非負整數，其中 nm。最少匹配 n 次且最多匹配 m 次。例如，「o 13」將匹配「fooooood」中的前三個 o。「o 01」等價於「o」。請注意在逗號和兩個數之間不能有空格。 非貪心量化：當該字元緊跟在任何一個其他重複修飾符（，n，n，nm）後面時，匹配模式是非貪婪的。非貪婪模式儘可能少的匹配所搜尋的字串，而預設的貪婪模式則儘可能多的匹配所搜尋的字串。例如，對於字串「oooo」，「o」將匹配單個「o」，而「o」將匹配所有「o」。 rn」的模式。 pattern 匹配並獲取這一匹配的子字串。該子字串用於向後引用。所獲取的匹配可以從產生的集合得到，在中使用集合，在中則使用 09 屬性。要匹配圓括號字元，請使用「」或「」。可帶數量字尾。 pattern 」來組合一個模式的各個部分是很有用。例如「industr yies」就是一個比「industryindustries」更簡略的表示式。 pattern 98NT2000」能匹配「Windows2000」中的「Windows」，但不能匹配「Windows31」中的「Windows」。預查不消耗字元，也就是說，在一個匹配發生後，在最後一次匹配之後立即開始下一次匹配的搜尋，而不是從包含預查的字元之後開始。 pattern 98NT2000」能匹配「Windows31」中的「Windows」，但不能匹配「Windows2000」中的「Windows」。預查不消耗字元，也就是說，在一個匹配發生後，在最後一次匹配之後立即開始下一次匹配的搜尋，而不是從包含預查的字元之後開始 pattern 98NT2000 Windows」能匹配「2000Windows」中的「Windows」，但不能匹配「31Windows」中的「Windows」。 pattern 98NT2000 Windows」能匹配「31Windows」中的「Windows」，但不能匹配「2000Windows」中的「Windows」。 xy 沒有包圍在 裡，其範圍是整個正則表示式。例如，「zfood」能匹配「z」或「food」。「zf ood」則匹配「zood」或「food」。 xyz 字元集合。匹配所包含的任意一個字元。例如，「abc」可以匹配「plain」中的「a」。特殊字元僅有反斜線 保持特殊含義，用於跳脫字元。其它特殊字元如星號、加號、各種括號等均作為普通字元。脫字元 如果出現在首位則表示負值字元集合；如果出現在字串中間就僅作為普通字元。連字元 如果出現在字串中間表示字元範圍描述；如果如果出現在首位（或末尾）則僅作為普通字元。右方括號應轉義出現，也可以作為首位字元出現。 xyz 排除型字元集合。匹配未列出的任意字元。例如，「abc」可以匹配「plain」中的「plin」。 az 字元範圍。匹配在 Unicode 編碼表指定範圍內的任意字元。例如，「az」可以匹配「a」到「z」範圍內的任意小寫字母字元。 az 排除型的字元範圍。匹配任何不在 Unicode 編碼表指定範圍內的任意字元。例如，「az」可以匹配任何不在「a」到「z」範圍內的任意字元。 name 增加命名字元類中的字元到表示式。只能用於方括號表示式。 elt 增加當前下排序等價於字元 的元素。例如，a 可能會增加 ä、á、à、ă、ắ、ằ、ẵ、ẳ、â、ấ、ầ、ẫ、ẩ、ǎ、å、ǻ、ä、ǟ、ã、ȧ、ǡ、ą、ā、ả、ȁ、ȃ、ạ、ặ、ậ、ḁ、ⱥ、ᶏ、ɐ、ɑ 。只能用於方括號表示式。 elt 增加排序元素到表示式中。這是因為某些排序元素由多個字元組成。例如，29 個字母表的西班牙語， CH 作為單個字母排在字母 C 之後，因此會產生如此排序 cinco credo chispa。只能用於方括號表示式。 b 匹配一個單詞邊界，也就是指單詞和空格間的位置。例如，「erb」可以匹配「never」中的「er」，但不能匹配「verb」中的「er」。 B 匹配非單詞邊界。「erB」能匹配「verb」中的「er」，但不能匹配「never」中的「er」。 cx 匹配由 x 指明的控制字元。x 的值必須為 AZ 或 az 之一。否則，將 c 視為一個原義的「c」字元。控制字元的值等於 x 的值最低 5 位元（即對 3210 進位制的餘數）。例如，cM 匹配一個或回車符。ca 等效於 u0001 cb 等效於 u0002 等等 d 匹配一個數字字元。等價於 09。注意正則表示式會匹配全形數字字元。 D 匹配一個非數字字元。等價於 09。 f 匹配一個換頁符。等價於 x0c 和 cL。 n 匹配一個換行符。等價於 x0a 和 cJ。 r 匹配一個回車符。等價於 x0d 和 cM。 s 匹配任何空白字元，包括空格、製表符、換頁符等等。等價於 fnrtv。注意正則表示式會匹配全形空格符。 S 匹配任何非空白字元。等價於 fnrtv。 t 匹配一個製表符。等價於 x09 和 cI。 v 匹配一個垂直製表符。等價於 x0b 和 cK。 w 匹配包括下劃線的任何單詞字元。等價於「AZaz09_」。注意正則表示式會匹配中文字元。 W 匹配任何非單詞字元。等價於「AZaz09_」。 xnn 十六進位制跳脫字元序列。匹配兩個十六進位制數字 nn 表示的字元。例如，「x41」匹配「A」。「x041」則等價於「x041」。正則表示式中可以使用編碼。 num 向後引用一個子字串，該子字串與正則表示式的第 num 個用括號圍起來的捕捉群子表示式匹配。其中 num 是從 1 開始的十進位制正整數，其上限可能是 9、31、99 甚至無限。例如：「1」匹配兩個連續的相同字元。 n 標識一個八進位制轉義值或一個向後引用。如果 n 之前至少 n 個獲取的子表示式，則 n 為向後引用。否則，如果 n 為八進位制數字（07），則 n 為一個八進位制轉義值。 nm 3 位八進位制數字，標識一個八進位制轉義值或一個向後引用。如果 nm 之前至少有 nm 個獲得子表示式，則 nm 為向後引用。如果 nm 之前至少有 n 個獲取，則 n 為一個後跟文字 m 的向後引用。如果前面的條件都不滿足，若 n 和 m 均為八進位制數字（07），則 nm 將匹配八進位制轉義值 nm。 nml 如果 n 為八進位制數字（03），且 m 和 l 均為八進位制數字（07），則匹配八進位制轉義值 nml。 un Unicode 跳脫字元序列。其中 n 是一個用四個十六進位制數字表示的字元。例如，u00A9 匹配版權符號。 Unicode 處理 在NET、、、的正則表示式中，可以用 uXXXX 表示一個字元，其中 XXXX 為四位 16 進位制數字。 字元的三種性質： Unicode Property：字元屬於標點、空格、字母等等。每個字元只能屬於唯一。NET、、和等語言支援。具體分類為： 字元 p L p Ll 或 p Lowercase_Letter：小寫字元（必須有大寫的形式）。 p Lu 或 p Uppercase_Letter：大寫字元（必須有小寫的形式）。 p Lt 或 p Titlecase_Letter：全詞首字母大寫的字元。 p L 或 p Cased_Letter：存在大小寫形式的字元（ 的組合）。 p Lm 或 p Modifier_Letter：音標修飾字符。 p Lo 或 p Other_Letter：不具有大小寫的字元或字形。 附加符號 p M p Mn 或 p Non_Spacing_Mark：與其他字元結合，不額外佔用空間的字元，例如日耳曼語母音變音。 p Mc 或 p Spacing_Combining_Mark：與其他字元結合，額外佔用空間的字元，例如馬拉雅拉姆文 母音字母及附標。 p Me 或 p Enclosing_Mark：包含其他字元的字元，例如圓圈、方塊。 分隔符 p Z p Zs 或 p Space_Separator：不可見的空格，但佔據空間。 p Zl 或 p Line_Separator：分隔綫字元 U2028。 p Zp 或 p Paragraph_Separator：分段字元 U2029。 符號 p S p Sm 或 p Math_Symbol：數學符號。 p Sc 或 p Currency_Symbol：通貨符號。 p Sk 或 p Modifier_Symbol：組合為其他字元的符號。 p So 或 p Other_Symbol：其他符號。 數值字元 p N p Nd 或 p Decimal_Digit_Number：所有文字中的數字 0 至 9 字元，不含形意符號。 p Nl 或 p Letter_Number：看起來像字母的符號，包含羅馬數字。 p No 或 p Other_Number：上角標或下角標數字，或者其他不屬於 0 至 9 的數字。不含形意符號。 標點符號 p P p Pd 或 p Dash_Punctuation：任何種類的連字號或連線號。 p Ps 或 p Open_Punctuation：任何種類開括號。 p Pe 或 p Close_Punctuation：任何種類閉括號。 p Pi 或 p Initial_Punctuation：任何種類開引號。 p Pf 或 p Final_Punctuation：任何種類閉引號。 p Pc 或 p Connector_Punctuation：連線詞的標點符號，如下劃線。 p Po 或 p Other_Punctuation：其他標點符號。 其它符號 p C（包括不可見控制字元與未用碼位） p Cc 或 p Control：ASCII 或 Latin1 控制字元 0x000x1F 與 0x7F0x9F。 p Cf 或 p Format：不可見的格式化指示字元。 p Co 或 p Private_Use：私用碼位。 p Cs 或 p Surrogate：UTF16 編碼的代理對的一半。 p Cn 或 p Unassigned：未被使用的碼位。 Unicode Block：按照編碼區間劃分字元，每個中的字元編碼屬於一個編碼區間。例如語言 p InCJK_Compatibility_Ideographs，NET 語言 p IsCJK_Compatibility_Ideographs。 Unicode Script：按照字元所屬的書寫系統來劃分字元。和（版本不低於 19）支援。例如 p Han 表示漢字（中文字元）。 這三種性質對應的字元組補集是將開頭的 p 改為 P，其它不變。 POSIX 字元組 POSIX 字元組 說明 ASCII 環境 Unicode 環境 alnum 字母字元和數字字元 azAZ09 p Lp Nd alpha 字母 azAZ p L ascii 字元 x00x7F p InBasicLatin blank 空格字元和製表符 t p Zst cntrl 控制字元 x00x1Fx7F p Cc digit 數字字元 09 p Nd graph 空白字元之外的字元 x21x7E p Zp C lower 小寫字母字元 az p Ll print 類似 graph，但包括空白字元 x20x7E P C punct 標點符號 p Pp S space 空白字元 trnvf p Ztrnvf upper 大寫字母字元 AZ p Lu word 字母字元 AZaz09_ p Lp Np Pc xdigit 十六進位制字元 AFaf09 AFaf09 優先權 優先權 符號 最高 高 、、、 中 、、、n、n、nm 低 、、中介字元 次最低 串接，即相鄰字元連線在一起 最低 範例 以下使用 PHP 語言 驗證字串是否只含數字與英文，字串長度並在 416 個字元之間： php str a1234 if preg_match azAZ09416 str echo CONFIRM else echo FAILED 簡易的中華民國國民身分證字號驗證： php str a1234 if preg_match AZaz1289d 8 str echo CONFIRM else echo FAILED 以下使用 Perl 語言 驗證字串是否只含數字與英文，字串長度並在 416 個字元之間： print str a1234 mazAZ09416 CONFIRM FAILED 簡易的中華民國身份證字號驗證： print str a1234 mw 1289d 8 CONFIRM INVALID 以下使用 python 語言 使用正則表示式匹配 ip 地址： import re s 1921371336 1921681137123 1921681138 print refindall rd25 052 04d01dd325 052 04d01ddds 相關條目 擴充套件巴科斯正規化 Thompson 構造法 註釋 參考文獻 外部連結 各種語言或工具軟體的不同風格的正則表示式文法規定 正則表示式 30 分鐘入門教程 正規表示式應用範例 正規化表示法 ProgWiki Regexper RegExr Learn Build Test RegEx 公式上的懸浮氣泡解釋該規則匹配的字串；匹配結果有對應的解釋；右側邊欄有正則表示式的詳細規範及圖中的小抄 regex101com 檢視匹配資訊，並且會用不同的顏色將 Group 標記出來。 Debuggex Online visual regex tester JavaScript Python and PCRE 另一個正則表示式的網頁線上除錯 驗證器，用狀態機圖解輸入的正則表示式的語義，並可檢測輸入的測試字串是否匹配該正則表示式 Category 編譯原理 Z Category 程式設計語言 Category 標記法 Category 帶有程式碼示例的條目