本網站的更多內容 |
簡介 |
正規表示式快速入門 |
正規表示式教學 |
替換字串教學 |
應用程式和語言 |
正規表示式範例 |
正規表示式參考 |
替換字串參考 |
書籍評論 |
可列印 PDF |
關於本網站 |
RSS 摘要和部落格 |
POSIX 中括號表達式是一種特殊的字元類別。POSIX 中括號表達式會比對一組字元中的其中一個字元,就像一般的字元類別一樣。它們使用相同的方括號語法。連字號會建立一個範圍,而開頭的插入符號會否定中括號表達式。
一個主要的語法差異是,在 POSIX 中括號表達式中,反斜線並非一個元字元。因此,在 POSIX 中,正規表示式[\d]會比對\或d。若要比對],請將其放在開頭[或否定^之後的第一個字元。若要比對-,請將其放在閉合]之前。若要比對^,請將其放在最後一個字面-或閉合]之前。組合起來,[\d^-]會比對]、\、d、^或-。
中括號表達式的主要目的是適應使用者的語言環境或應用程式的語言環境。語言環境是一組規則和設定,用來描述語言和文化慣例,例如排序順序、日期格式等。POSIX 標準定義了這些語言環境。
一般來說,只有 符合 POSIX 的正規表示式引擎 才對 POSIX 中括號表示式有適當且完整的支援。有些非 POSIX 正規表示式引擎支援 POSIX 字元類別,但通常不支援整理序列和等效字元。支援 Unicode 的正規表示式引擎使用 Unicode 屬性和腳本來提供類似於 POSIX 中括號表示式的功能。在 Unicode 正規表示式引擎中,簡寫字元類別(例如 \w)通常會比對所有相關的 Unicode 字元,減輕使用區域設定的需求。
不要將 POSIX 術語「字元類別」與通常稱為 正規表示式字元類別 的東西混淆。[x-z0-9] 是本教學課程中稱為「字元類別」的範例,而 POSIX 稱為「中括號表示式」。[:digit:] 是 POSIX 字元類別,用在中括號表示式中,例如 [x-z[:digit:]]。POSIX 字元類別名稱必須全部以小寫寫入。
當用於 ASCII 字串時,這兩個正規表示式會找到完全相同的比對結果:一個字元,可能是 x、y、z 或數字。當用於含有非 ASCII 字元的字串時,[:digit:] 類別可能會包含其他腳本中的數字,視區域設定而定。
POSIX 標準定義了 12 個字元類別。下表列出全部 12 個類別,以及某些正規表示式風格也支援的 [:ascii:] 和 [:word:] 類別。此表也顯示您可以用在 ASCII 和 Unicode 正規表示式中的等效字元類別(如果 POSIX 類別不可用)。ASCII 等效字元與 POSIX 標準中定義的內容完全對應。Unicode 等效字元與大多數 Unicode 正規表示式引擎比對的內容對應。POSIX 標準未定義 Unicode 區域設定。有些類別也有 Perl 風格的 簡寫 等效字元。
Java 不支援 POSIX 中括號表示式,但使用 \p 算子支援 POSIX 字元類別。儘管 \p 語法是從 Unicode 屬性 的語法借來的,但 Java 中的 POSIX 類別只比對 ASCII 字元,如下所示。類別名稱區分大小寫。與只能用於中括號表示式中的 POSIX 語法不同,Java 的 \p 可以用於中括號表示式內外。
在 Java 8 及之前版本中,無論您是否在 \p 語法中使用 Is 字首都沒有關係。因此在 Java 8 中,\p{Alnum} 和 \p{IsAlnum} 是相同的。在 Java 9 及之後版本中則有所不同。如果不使用 Is 字首,行為與之前版本的 Java 完全相同。現在,使用 Is 字首的語法也會比對 Unicode 字元。對於 \p{IsPunct},這也表示它不再比對符號 Unicode 類別中的 ASCII 字元。
JGsoft 風格支援 POSIX 和 Java 語法。最初它使用任一種語法比對 Unicode 字元。從 JGsoft V2 開始,使用 POSIX 語法時它只比對 ASCII 字元,而使用 Java 語法時則比對 Unicode 字元。
POSIX | 說明 | ASCII | Unicode | 簡寫 | Java |
---|---|---|---|---|---|
[:alnum:] | 字母數字字元 | [a-zA-Z0-9] | [\p{L}\p{Nl} \p{Nd}] | \p{Alnum} | |
[:alpha:] | 字母字元 | [a-zA-Z] | \p{L}\p{Nl} | \p{Alpha} | |
[:ascii:] | ASCII 字元 | [\x00-\x7F] | \p{InBasicLatin} | \p{ASCII} | |
[:blank:] | 空白和 tab | [ \t] | [\p{Zs}\t] | \h | \p{Blank} |
[:cntrl:] | 控制字元 | [\x00-\x1F\x7F] | \p{Cc} | \p{Cntrl} | |
[:digit:] | 數字 | [0-9] | \p{Nd} | \d | \p{Digit} |
[:graph:] | 可見字元(任何字元,除了空白和控制字元) | [\x21-\x7E] | [^\p{Z}\p{C}] | \p{Graph} | |
[:lower:] | 小寫字母 | [a-z] | \p{Ll} | \l | \p{Lower} |
[:print:] | 可見字元和空白(任何字元,除了控制字元) | [\x20-\x7E] | \P{C} | \p{Print} | |
[:punct:] | 標點符號(和符號)。 | [!"\#$%&'()*+, \-./:;<=>?@\[ \\\]^_`{|}~] | \p{P} | \p{Punct} | |
[:space:] | 所有空白字元,包括換行 | [ \t\r\n\v\f] | [\p{Z}\t\r\n\v\f] | \s | \p{Space} |
[:upper:] | 大寫字母 | [A-Z] | \p{Lu} | \u | \p{Upper} |
[:word:] | 字元字元(字母、數字和底線) | [A-Za-z0-9_] | [\p{L}\p{Nl} \p{Nd}\p{Pc}] | \w | \p{IsWord} |
[:xdigit:] | 十六進位數字 | [A-Fa-f0-9] | [A-Fa-f0-9] | \p{XDigit} | |
POSIX | 說明 | ASCII | Unicode | 簡寫 | Java |
POSIX 地區設定可以有排序順序,用來描述特定字元或字元群組應如何排序。例如在捷克語中,ch 如同 chemie(捷克語中的「化學」)是一個 二合字母。這表示它應視為一個字元。在捷克語字母表中,它的排序在 h 和 i 之間。當捷克語地區設定 (cs-CZ) 啟用時,您可以在方括號表達式中使用排序順序元素 [.ch.] 來比對 ch。正規表示法 [[.ch.]]emie 比對 chemie。請注意雙重方括號。一對用於方括號表達式,另一對用於排序順序。
除了 POSIX 相容系統中 POSIX 相容引擎之外,本教學課程中討論的正規表示法風格都不支援排序順序。
請注意,當地區設定設為捷克語時,完全 POSIX 相容的正規表示法引擎會將 ch 視為單一字元。這表示 [^x]emie 也會比對 chemie。 [^x] 比對的字元不是 x,其中包括捷克語 POSIX 地區設定中的 ch。
在任何其他正規表示法引擎中,或是在不將 ch 視為二合字母的地區設定中使用 POSIX 引擎時,[^x]emie 會比對拼錯的字詞 cemie,但不會比對 chemie,因為 [^x] 無法比對兩個字元 ch。
最後,請注意,並非所有宣稱實作 POSIX 正規表示法的正規表示法引擎都真正完全支援排序順序。有時,這些引擎會使用 POSIX 定義的正規表示法語法,但沒有完整的區域設定支援。您可能想嘗試上述比對,看看您使用的引擎是否支援。例如,Tcl 的 regexp 指令 支援排序順序的語法。但 Tcl 只支援 Unicode 地區設定,而 Unicode 地區設定沒有定義任何排序順序。結果是,在 Tcl 中,指定單一字元的排序順序只會比對該字元。所有其他排序順序都會導致錯誤。
POSIX 地區設定可以定義字元等效,表示某些字元在排序時應視為相同。例如在法語中,排序字詞時會忽略重音符號。 élève 在 être 之前,而 être 在 événement 之前。 é 和 ê 都和 e 相同,但 l 在 t 之前,而 t 在 v 之前。當地區設定設為法語時,POSIX 相容的正規表示法引擎會比對 e、é、è 和 ê,當您在方括號表達式 [[=e=]] 中使用排序順序 [=e=] 時。
如果一個字元沒有任何等價字元,字元等價符號只會還原成字元本身。例如,[[=x=][=z=]],在法語環境中,等同於 [xz]。
與校對序列類似,POSIX 字元等價在本文討論的任何正規表示式引擎中都不可用,除非它們遵循 POSIX 標準。而那些遵循標準的引擎可能沒有必要的 POSIX 環境支援。Tcl 的 regexp 指令也支援字元等價的語法。但是 Unicode 環境(Tcl 僅支援此環境)沒有定義任何字元等價。這實際上表示,在 Tcl 中,[[=e=]] 和 [e] 完全相同,而且只會比對 e,無論您嘗試使用哪個字元取代「e」。
| 快速入門 | 教學 | 工具與語言 | 範例 | 參考 | 書籍評論 |
| 簡介 | 目錄 | 特殊字元 | 非列印字元 | 正規表示式引擎內部 | 字元類別 | 字元類別減法 | 字元類別交集 | 簡寫字元類別 | 點 | 錨點 | 字詞邊界 | 交替 | 選用項目 | 重複 | 群組和擷取 | 反向參照 | 反向參照,第 2 部分 | 命名群組 | 相對反向參照 | 分支重設群組 | 自由間距和註解 | Unicode | 模式修改器 | 原子群組 | 獨佔量詞 | 向前和向後觀望 | 向前和向後觀望,第 2 部分 | 將文字保留在比對之外 | 條件式 | 平衡群組 | 遞迴 | 子常式 | 無限遞迴 | 遞迴和量詞 | 遞迴和擷取 | 遞迴和反向參照 | 遞迴和回溯 | POSIX 方括號表示式 | 零長度比對 | 繼續比對 |
頁面網址:https://regular-expressions.dev.org.tw/posixbrackets.html
頁面最後更新時間:2023 年 8 月 29 日
網站最後更新時間:2024 年 3 月 15 日
版權所有 © 2003-2024 Jan Goyvaerts。保留所有權利。