-
字符類
鎖定
字符類是一個字符集,如果字符集中的任何一個字符有匹配,它就會找到該匹配項。
- 中文名
- 字符類
- 外文名
- character classes
- 數字字符
- [:digit:]
- 字母字符
- [:alpha:]
- 控制字符
- [:cntrl:]
目錄
- 1 定義
- 2 正則表達式中的字符類
- ▪ 正字符組:[ ]
- ▪ 負字符組:[^]
- ▪ 任意字符:.
- ▪ 非空白字符:\S
- ▪ 十進制數字字符:\d
- ▪ 非數字字符:\D
- ▪ 支持的 Unicode 常規類別
- ▪ 支持的命名塊
- ▪ 字符類減法
- 3 POSIX風格的正則表達式
- ▪ 論述
- ▪ POSIX字符類型
字符類定義
字符類是正則表達式中的“迷你”語言,在方括號 [ ] 中定義。最簡單的字符類只不過是括號中的一個字符表,如 [aeiou]。在表達式中使用字符類時,可在模式的此位置使用其中任何一個字符(但只能使用一個字符,除非使用了限定符)。請注意,不能使用字符類定義單詞或模式,只能定義單個字符。
[1]
字符類正則表達式中的字符類
一個字符類定義一組字符,其中的任一字符均可出現在輸入字符串中以便成功匹配。.NET Framework中的正則表達式語言支持以下字符類:
- 正字符組。 輸入字符串中的字符必須匹配一組指定的字符中的某個字符。
- 負字符組。 輸入字符串中的字符不得匹配一組指定的字符中的某個字符。
- 任意字符。 正則表達式中的 .(圓點或句點)字符是匹配除 \n 之外的任何字符的通配符字符。
- 通用 Unicode 類別或命名塊。 輸入字符串中的字符必須為特定 Unicode 類別的成員,或必須位於一系列連續的 Unicode 字符中才能成功匹配。
- 負通用 Unicode 類別或命名塊。 輸入字符串中的字符不得為特定 Unicode 類別的成員,也不得位於一系列連續的 Unicode 字符中以便成功匹配。
- 單詞字符。 輸入字符串中的字符可以屬於適合單詞中字符的任何 Unicode 類別。
- 非單詞字符。 輸入字符串中的字符可以屬於作為非單詞字符的任何 Unicode 類別。
- 空白字符。 輸入字符串中的字符可以是任何 Unicode 分隔符字符以及眾多控制字符中的任一字符。
- 非空白字符。 輸入字符串中的字符可以是作為非空白字符的任何字符。
- 十進制數字。 輸入字符串中的字符可以是歸類為 Unicode 十進制數字的眾多字符中的任一字符。
- 非十進制數字。 輸入字符串中的字符可以是任何非 Unicode 十進制數字。
字符類正字符組:[ ]
正字符組指定一個字符列表,其中的任何一個字符可出現在輸入字符串中以便進行匹配。此字符列表可以單獨指定和/或作為範圍指定。
用於指定各個字符列表的語法如下所示:
[character_group]
其中,character_group 是單個字符的列表,這些字符可出現在輸入字符串中以便成功匹配。 character_group 可以包括一個或多個文本字符、 轉義符或字符類的任意組合。
用於指定字符範圍的語法如下:
[firstCharacter-lastCharacter]
其中,firstCharacter 是範圍的開始字符,lastCharacter 是範圍的結束字符。字符範圍是通過以下方式定義的一系列連續字符:指定系列中的第一個字符,連字符 (-),然後指定系列中的最後一個字符。如果兩個字符具有相鄰的 Unicode 碼位,則這兩個字符是連續的。
下表列出了一些常見的包含正字符類的正則表達式模式。
模式 | 描述 |
---|---|
[aeiou] | 匹配所有元音。 |
[\p{P}\d] | 匹配所有標點符號和十進制數字字符。 |
[\s\p{P}] | 匹配所有空白和標點符號。 |
字符類負字符組:[^]
負字符組指定一個字符列表,這些字符不得出現在輸入字符串中以便進行匹配。此字符列表可以單獨指定和/或作為範圍指定。
用於指定各個字符列表的語法如下所示:
[^character_group]
其中,character_group 是單個字符的列表,這些字符不可出現在輸入字符串中以便成功匹配。 character_group 可以包括一個或多個文本字符、 轉義符或字符類的任意組合。
用於指定字符範圍的語法如下:
[^firstCharacter-lastCharacter]
其中,firstCharacter 是範圍的開始字符,lastCharacter 是範圍的結束字符。字符範圍是通過以下方式定義的一系列連續字符:指定系列中的第一個字符,連字符 (-),然後指定系列中的最後一個字符。如果兩個字符具有相鄰的 Unicode 碼位,則這兩個字符是連續的。
可以連接兩個或更多字符範圍。例如,若要指定從“0”至“9”的十進制數範圍、從“a”至“f”的小寫字母範圍,以及從“A”至“F”的大寫字母範圍,請使用 [0-9a-fA-F]。
負字符組中的前導符 (^) 是強制的,指示字符組為負字符組,而不是正字符組。
下表列出了一些常見的包含負字符組的正則表達式模式
模式 | 描述 |
---|---|
[^aeiou] | 匹配除元音以外的所有字符。 |
[^\p{P}\d] | 匹配標點符號和十進制數字字符以外的所有字符。 |
字符類任意字符:.
句點字符 (.) 匹配除 \n(換行符 \u000A)之外的任何字符,有以下兩個限制:
- 如果通過 RegexOptions.Singleline 選項修改正則表達式模式,或者通過 . 選項修改包含 s 字符類的模式的部分,則 . 可匹配任何字符。
- 正字符組或負字符組中的句點字符將被視為原義句點字符,而非字符類。
字符類Unicode類別或Unicode塊:\p{}
Unicode 標準為每個常規類別分配一個字符。例如,特定字符可以是大寫字母(由 Lu 類別表示),十進制數字(Nd 類別)、數學符號(Sm 類別)或段落分隔符(Zl 類別)。Unicode 標準中的特定字符集也佔據連續碼位的特定區域或塊。例如,可在 \u0000 和 \u007F 之間找到基本拉丁字符集,並可在 \u0600 和 \u06FF 之間找到阿拉伯語字符集。
正則表達式構造:
\p{名稱}
匹配屬於 Unicode 常規類別或命名塊的任何字符,其中,名稱是類別縮寫或命名塊的名稱。
字符類負 Unicode 類別或 Unicode 塊:\P {}
Unicode 標準為每個常規類別分配一個字符。例如,特定字符可以是大寫字母(由 Lu 類別表示),十進制數字(Nd 類別)、數學符號(Sm 類別)或段落分隔符(Zl 類別)。Unicode 標準中的特定字符集也佔據連續碼位的特定區域或塊。例如,可在 \u0000 和 \u007F 之間找到基本拉丁字符集,並可在 \u0600 和 \u06FF 之間找到阿拉伯語字符集。
正則表達式構造:
\P{名稱}
匹配不屬於 Unicode 常規類別或命名塊的任何字符,其中,名稱是類別縮寫或命名塊的名稱。
字符類單詞字符:\w
\w 與任何單詞字符匹配。單詞字符是下表中列出的任何 Unicode 類別的成員。
類別 | 描述 |
---|---|
Ll | 字母,小寫 |
Lu | 字母,大寫 |
Lt | 字母,首字母大寫 |
Lo | 字母,其他 |
Lm | 字母,修飾符 |
Nd | 數字,十進制數 |
Pc | 標點,連接符。 此類別包含 10 個字符,最常用的字符是 LOWLINE 字符 (_),u+005F。 |
如果指定了符合 ECMAScript 的行為,則 \w 等效於 [a-zA-Z_0-9]。
字符類非單詞字符:\W
\W 匹配任何非單詞字符。\W 語言元素等效於以下字符類:
[^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}]
換言之,它與下表中列出的字符以外的任何字符匹配。
類別 | 描述 |
---|---|
Ll | 字母,小寫 |
Lu | 字母,大寫 |
Lt | 字母,首字母大寫 |
Lo | 字母,其他 |
Lm | 字母,修飾符 |
Nd | 數字,十進制數 |
Pc | 標點,連接符。 此類別包含 10 個字符,最常用的字符是 LOWLINE 字符 (_),u+005F。 |
如果指定了符合 ECMAScript 的行為,則 \W 等效於 [^a-zA-Z_0-9]。
字符類空白字符:\s
\s 匹配任何空白字符。它等效於下表中列出的轉義序列和 Unicode 類別。
類別 | 描述 |
---|---|
\f | 窗體換頁符,\u000C。 |
\n | 換行符,\u000A。 |
\r | 回車符,\u000D。 |
\t | 製表符,\u0009。 |
\v | 垂直製表符,\u000B。 |
\x85 | 省略號或 NEXT LINE (NEL) 字符 (…),\u0085。 |
\p{Z} | 匹配任何分隔符。 |
如果指定了符合 ECMAScript 的行為,則 \s 等效於 [\f\n\r\t\v]。
字符類非空白字符:\S
\S 匹配任何非空白字符。它等效於 [^\f\n\r\t\v\x85\p{Z}] 正則表達式模式或與等效於 \s 的正則表達式模式(與空白字符匹配)相反。
如果指定了符合 ECMAScript 的行為,則 \S 等效於 [^ \f\n\r\t\v]。
字符類十進制數字字符:\d
\d 匹配任何十進制數字。它等效於 \p{Nd} 正則表達式模式,該模式包含標準的十進制數字 0-9 以及眾多其他字符集的十進制數字。
如果指定了符合 ECMAScript 的行為,則 \d 等效於 [0-9]。
字符類非數字字符:\D
\D 匹配任何非數字字符。它等效於 \P{Nd} 正則表達式模式。
如果指定了符合 ECMAScript 的行為,則 \D 等效於 [^0-9]。
字符類支持的 Unicode 常規類別
Unicode 定義下表列出的常規類別。
類別 | 描述 |
---|---|
Lu | 字母,大寫 |
Ll | 字母,小寫 |
Lt | 字母,首字母大寫 |
Lm | 字母,修飾符 |
Lo | 字母,其他 |
L | 所有字母字符。 這包括 Lu、Ll、Lt、Lm 和 Lo 字符。 |
Mn | 標記,非間距 |
Mc | 標記,間距組合 |
Me | 標記,封閉 |
M | 所有音調符號標記。 這包括 Mn、Mc 和 Me 類別。 |
Nd | 數字,十進制數 |
Nl | 數字,字母 |
No | 數字,其他 |
N | 所有數字。 這包括 Nd、Nl 和 No 類別。 |
Pc | 標點,連接符 |
Pd | 標點,短劃線 |
Ps | 標點,開始 |
Pe | 標點,結束 |
Pi | 標點,前引號(根據具體使用情況,作用可能像 Ps 或 Pe) |
Pf | 標點,後引號(根據具體使用情況,作用可能像 Ps 或 Pe) |
Po | 標點,其他 |
P | 所有標點字符。 這包括 Pc、Pd、Ps, Pe、Pi、Pf 和 Po 類別。 |
Sm | 符號,數學 |
Sc | 符號,貨幣 |
Sk | 符號,修飾符 |
So | 符號,其他 |
S | 所有符號。 這包括 Sm、Sc、Sk 和 So 類別。 |
Zs | 分隔符,空白 |
Zl | 分隔符,行 |
Zp | 分隔符,段落 |
Z | 所有分隔符字符。 這包括 Zs、Zl 和 Zp 類別。 |
Cc | 其他,控制 |
Cf | 其他,格式 |
Cs | 其他,代理項 |
Co | 其他,私用 |
Cn | 其他,未賦值(任何字符都不具有此屬性) |
C | 所有控制字符。 這包括 Cc、Cf、Cs、Co 和 Cn 類別。 |
可以通過將任何特定字符傳遞到 GetUnicodeCategory 方法來確定該字符的 Unicode 類別。
字符類支持的命名塊
.NET Framework提供下表列出的命名塊。該組支持的命名塊基於 Unicode 4.0 和 Perl 5.6。
碼位範圍 | 塊名稱 |
---|---|
0000 - 007F | IsBasicLatin |
0080 - 00FF | IsLatin-1Supplement |
0100 - 017F | IsLatinExtended-A |
0180 - 024F | IsLatinExtended-B |
0250 - 02AF | IsIPAExtensions |
02B0 - 02FF | IsSpacingModifierLetters |
0300 - 036F | IsCombiningDiacriticalMarks |
0370 - 03FF | IsGreek - 或 - IsGreekandCoptic |
0400 - 04FF | IsCyrillic |
0500 - 052F | IsCyrillicSupplement |
0530 - 058F | IsArmenian |
0590 - 05FF | IsHebrew |
0600 - 06FF | IsArabic |
0700 - 074F | IsSyriac |
0780 - 07BF | IsThaana |
0900 - 097F | IsDevanagari |
0980 - 09FF | IsBengali |
0A00 - 0A7F | IsGurmukhi |
0A80 - 0AFF | IsGujarati |
0B00 - 0B7F | IsOriya |
0B80 - 0BFF | IsTamil |
0C00 - 0C7F | IsTelugu |
0C80 - 0CFF | IsKannada |
0D00 - 0D7F | IsMalayalam |
0D80 - 0DFF | IsSinhala |
0E00 - 0E7F | IsThai |
0E80 - 0EFF | IsLao |
0F00 - 0FFF | IsTibetan |
1000 - 109F | IsMyanmar |
10A0 - 10FF | IsGeorgian |
1100 - 11FF | IsHangulJamo |
1200 - 137F | IsEthiopic |
13A0 - 13FF | IsCherokee |
1400 - 167F | IsUnifiedCanadianAboriginalSyllabics |
1680 - 169F | IsOgham |
16A0 - 16FF | IsRunic |
1700 - 171F | IsTagalog |
1720 - 173F | IsHanunoo |
1740 - 175F | IsBuhid |
1760 - 177F | IsTagbanwa |
1780 - 17FF | IsKhmer |
1800 - 18AF | IsMongolian |
1900 - 194F | IsLimbu |
1950 - 197F | IsTaiLe |
19E0 - 19FF | IsKhmerSymbols |
1D00 - 1D7F | IsPhoneticExtensions |
1E00 - 1EFF | IsLatinExtendedAdditional |
1F00 - 1FFF | IsGreekExtended |
2000 - 206F | IsGeneralPunctuation |
2070 - 209F | IsSuperscriptsandSubscripts |
20A0 - 20CF | IsCurrencySymbols |
20D0 - 20FF | IsCombiningDiacriticalMarksforSymbols - 或 - IsCombiningMarksforSymbols |
2100 - 214F | IsLetterlikeSymbols |
2150 - 218F | IsNumberForms |
2190 - 21FF | IsArrows |
2200 - 22FF | IsMathematicalOperators |
2300 - 23FF | IsMiscellaneousTechnical |
2400 - 243F | IsControlPictures |
2440 - 245F | IsOpticalCharacterRecognition |
2460 - 24FF | IsEnclosedAlphanumerics |
2500 - 257F | IsBoxDrawing |
2580 - 259F | IsBlockElements |
25A0 - 25FF | IsGeometricShapes |
2600 - 26FF | IsMiscellaneousSymbols |
2700 - 27BF | IsDingbats |
27C0 - 27EF | IsMiscellaneousMathematicalSymbols-A |
27F0 - 27FF | IsSupplementalArrows-A |
2800 - 28FF | IsBraillePatterns |
2900 - 297F | IsSupplementalArrows-B |
2980 - 29FF | IsMiscellaneousMathematicalSymbols-B |
2A00 - 2AFF | IsSupplementalMathematicalOperators |
2B00 - 2BFF | IsMiscellaneousSymbolsandArrows |
2E80 - 2EFF | IsCJKRadicalsSupplement |
2F00 - 2FDF | IsKangxiRadicals |
2FF0 - 2FFF | IsIdeographicDescriptionCharacters |
3000 - 303F | IsCJKSymbolsandPunctuation |
3040 - 309F | IsHiragana |
30A0 - 30FF | IsKatakana |
3100 - 312F | IsBopomofo |
3130 - 318F | IsHangulCompatibilityJamo |
3190 - 319F | IsKanbun |
31A0 - 31BF | IsBopomofoExtended |
31F0 - 31FF | IsKatakanaPhoneticExtensions |
3200 - 32FF | IsEnclosedCJKLettersandMonths |
3300 - 33FF | IsCJKCompatibility |
3400 - 4DBF | IsCJKUnifiedIdeographsExtensionA |
4DC0 - 4DFF | IsYijingHexagramSymbols |
4E00 - 9FFF | IsCJKUnifiedIdeographs |
A000 - A48F | IsYiSyllables |
A490 - A4CF | IsYiRadicals |
AC00 - D7AF | IsHangulSyllables |
D800 - DB7F | IsHighSurrogates |
DB80 - DBFF | IsHighPrivateUseSurrogates |
DC00 - DFFF | IsLowSurrogates |
E000 - F8FF | IsPrivateUse 或 IsPrivateUseArea |
F900 - FAFF | IsCJKCompatibilityIdeographs |
FB00 - FB4F | IsAlphabeticPresentationForms |
FB50 - FDFF | IsArabicPresentationForms-A |
FE00 - FE0F | IsVariationSelectors |
FE20 - FE2F | IsCombiningHalfMarks |
FE30 - FE4F | IsCJKCompatibilityForms |
FE50 - FE6F | IsSmallFormVariants |
FE70 - FEFF | IsArabicPresentationForms-B |
FF00 - FFEF | IsHalfwidthandFullwidthForms |
FFF0 - FFFF | IsSpecials |
字符類字符類減法
[base_group - [excluded_group]]
一個字符類定義一組字符。字符類減法將產生一組字符,該組字符是從一個字符類中排除另一個字符類中的字符的結果。
字符類減法表達式具有以下形式:
[base_group-[excluded_group]]
方括號 ([]) 和連字符 (-) 是強制的。base_group 是正字符組或負字符組。excluded_group 部分是另一個正字符組或負字符組,或者是另一個字符類減法表達式(即,可以嵌套字符類減法表達式)。
例如,假設你有一個由從“a”至“z”範圍內的字符組成的基本組。若要定義由除字符“m”之外的基本組組成的字符集,請使用 [a-z-[m]]。若要定義由除字符集“d”、“j”和“p”之外的基本組組成的字符集,請使用 [a-z-[djp]]。若要定義由除從“m”至“p”字符範圍之外的基本組組成的字符集,請使用 [a-z-[m-p]]。
可考慮使用嵌套字符類減法表達式 [a-z-[d-w-[m-o]]]。該表達式由最裏面的字符範圍向外計算。首先,在從“d”至“w”的字符範圍中減去從“m”至“o”的字符範圍,這將產生從“d”至“l”和從“p”至“w”的字符集。然後,在從“a”至“z”的字符範圍中減去該集合,這將產生字符集 [abcmnoxyz]。
可以將任何字符類用於字符類減法。若要定義字符集,且該字符集包括除空白字符 (\s)、標點通用類別中的字符 (\p{P})、IsGreek 命名塊中的字符 (\p{IsGreek}) 以及 Unicode NEXT LINE 控制字符 (\x85) 之外的所有從 \u0000 至 \uFFFF 的 Unicode 字符,請使用 [\u0000-\uFFFF-[\s\p{P}\p{IsGreek}\x85]]。
為字符類減法表達式選擇將會產生有用結果的字符類。避免使用產生空字符集的表達式,這將無法匹配任何內容,同時避免使用等效於初始基本組的表達式。例如,表達式 [\p{IsBasicLatin}-[\x00-\x7F]] 從 IsBasicLatin 常規類別中減去 IsBasicLatin 字符範圍內的所有字符,其結果為空集合。類似地,表達式 [a-z-[0-9]] 的結果為初始基本組。這是因為,基本組(它是從“a”至“z”的字母組成的字符範圍)不包含排除組(它是從“0”至“9”的十進制數組成的字符範圍)中的任何字符。
[2]
字符類POSIX風格的正則表達式
字符類論述
POSIX風格的正則表達式使用Unix地區系統(locale system),該系統提供了排序和識別字符的函數來讓你智能地處理其他非英語的文本。特別地,各種語言組成單詞的”字母”(如à和ç)不同,POSIX正則表達式考慮到了這一點並提供相應的字符類。
然而,POSIX正則表達式是為使用僅有原文的數據而設計的。如果數據中有空字節(\x00),那麼正則表達式函數把它理解為字符串的末尾,並且匹配不會超過該字節位置。要匹配任意的二進制數據,需要使用兼容Perl的正則表達式。Perl風格的正則表達式函數常常比等效的POSIX風格的函數快。
[3]
字符類POSIX字符類型
POSIX定義了許多可以在字符類中使用的命名字符集。
每一個[:something:]類都可被用於替代一個字符類中的字符。例如,要查找任一數字字符、大寫字母或一個@ 符號,可以使用下面的正則表達式:
[@[:digit:][:upper:]]
但是,不能把一個字符類當作一個範圍的終點使用:
ereg('[A-[:lower:]]', 'string'); //非法的正則表達式
一些地區把某些字符序列當作一個單獨的字符來考慮——它們被稱為排序序列(collating sequence)。在字符類中匹配這些多字符序列中的一個時,要把它用[. 和 .]括起來。
例如,如果你的地區有排序序列ch,你可以使用下面的字符類來匹配s、t或ch:
[st[.ch.]]
POSIX最後的字符類擴展是等價類(equivalence class),把字符用[=和=]括起來指定。等價字符類匹配有相同整理順序的字符(由當前locale定義)。例如,一個地區可能定義a、á和 ä有相同的排序優先級。要匹配它們中的一個,等價類為[=a=]。
[3]
類 | 描述 | 擴展 |
[:alnum:] | 字母與數字字符 | [0-9a-zA-Z] |
[:digit:] | 數字字符 | [a-zA-Z] |
[:alpha:] | 字母字符 | [a-zA-Z] |
[:blank:] | 空格與製表符 | [ \t] |
[:cntrl:] | 控制字符 | [\x01-\x1F] |
[:graph:] | 可打印與可見字符 | [^\x01-\x20] |
[:lower:] | 小寫字符 | [a-z] |
[:upper:] | 大寫字符 | [A-Z] |
[:print:] | 可打印字符 | [\t\x20-\xFF] |
[:punct:] | 標點字符 | [-!"#$%&'( )*+,./:;<=>?@[\\\]^_'{|}~] |
- 參考資料
-
- 1. 字符類 .CSDN[引用日期2017-04-25]
- 2. 正則表達式中的字符類 .TechNet[引用日期2017-04-25]
- 3. POSIX風格的正則表達式 .CSDN[引用日期2017-04-25]