字元類

字元類

字元類是一個字元集,如果字元集中的任何一個字元有匹配,它就會找到該匹配項。

基本介紹

  • 中文名:字元類
  • 外文名:character classes
  • 數字字元:[:digit:]
  • 字母字元:[:alpha:]
  • 控制字元:[:cntrl:]
定義,正則表達式中的字元類,正字元組:[ ],負字元組:[^],任意字元:.,Unicode類別或Unicode塊:\p{},負 Unicode 類別或 Unicode 塊:\P {},單詞字元:\w,非單詞字元:\W,空白字元:\s,非空白字元:\S,十進制數字字元:\d,非數字字元:\D,支持的 Unicode 常規類別,支持的命名塊,字元類減法:,POSIX風格的正則表達式,論述,POSIX字元類型,

定義

字元類是正則表達式中的“迷你”語言,在方括弧 [ ] 中定義。最簡單的字元類只不過是括弧中的一個字元表,如 [aeiou]。在表達式中使用字元類時,可在模式的此位置使用其中任何一個字元(但只能使用一個字元,除非使用了限定符)。請注意,不能使用字元類定義單詞或模式,只能定義單個字元。

正則表達式中的字元類

一個字元類定義一組字元,其中的任一字元均可出現在輸入字元串中以便成功匹配。.NET Framework中的正則表達式語言支持以下字元類:
  • 正字元組。 輸入字元串中的字元必須匹配一組指定的字元中的某個字元。
  • 負字元組。 輸入字元串中的字元不得匹配一組指定的字元中的某個字元。
  • 任意字元。 正則表達式中的 .(圓點或句點)字元是匹配除 \n 之外的任何字元的通配符字元。
  • 通用 Unicode 類別或命名塊。 輸入字元串中的字元必須為特定 Unicode 類別的成員,或必須位於一系列連續的 Unicode 字元中才能成功匹配。
  • 負通用 Unicode 類別或命名塊。 輸入字元串中的字元不得為特定 Unicode 類別的成員,也不得位於一系列連續的 Unicode 字元中以便成功匹配。
  • 單詞字元。 輸入字元串中的字元可以屬於適合單詞中字元的任何 Unicode 類別。
  • 非單詞字元。 輸入字元串中的字元可以屬於作為非單詞字元的任何 Unicode 類別。
  • 空白字元。 輸入字元串中的字元可以是任何 Unicode 分隔設定字元以及眾多控制字元中的任一字元。
  • 非空白字元。 輸入字元串中的字元可以是作為非空白字元的任何字元。
  • 十進制數字。 輸入字元串中的字元可以是歸類為 Unicode 十進制數字的眾多字元中的任一字元。
  • 非十進制數字。 輸入字元串中的字元可以是任何非 Unicode 十進制數字。
.NET Framework支持字元類減法表達式,通過該表達式可以定義一組字元作為從一個字元類中排除另一字元類的結果。

正字元組:[ ]

正字元組指定一個字元列表,其中的任何一個字元可出現在輸入字元串中以便進行匹配。此字元列表可以單獨指定和/或作為範圍指定。
用於指定各個字元列表的語法如下所示:
[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”的十進制數組成的字元範圍)中的任何字元。

POSIX風格的正則表達式

論述

POSIX風格的正則表達式使用Unix地區系統(locale system),該系統提供了排序和識別字元的函式來讓你智慧型地處理其他非英語的文本。特別地,各種語言組成單詞的”字母”(如à和ç)不同,POSIX正則表達式考慮到了這一點並提供相應的字元類。
然而,POSIX正則表達式是為使用僅有原文的數據而設計的。如果數據中有空位元組(\x00),那么正則表達式函式把它理解為字元串的末尾,並且匹配不會超過該位元組位置。要匹配任意的二進制數據,需要使用兼容Perl的正則表達式。Perl風格的正則表達式函式常常比等效的POSIX風格的函式快。

POSIX字元類型

POSIX定義了許多可以在字元類中使用的命名字元集。
每一個[:something:]類都可被用於替代一個字元類中的字元。例如,要查找任一數字字元、大寫字母或一個@ 符號,可以使用下面的正則表達式:
[@[:digit:][:upper:]]
但是,不能把一個字元類當作一個範圍的終點使用:
ereg('[A-[:lower:]]', 'string'); //非法的正則表達式
一些地區把某些字元序列當作一個單獨的字元來考慮——它們被稱為排序序列(collating sequence)。在字元類中匹配這些多字元序列中的一個時,要把它用[. 和 .]括起來。
例如,如果你的地區有排序序列ch,你可以使用下面的字元類來匹配s、t或ch:
[st[.ch.]]
POSIX最後的字元類擴展是等價類(equivalence class),把字元用[=和=]括起來指定。等價字元類匹配有相同整理順序的字元(由當前locale定義)。例如,一個地區可能定義a、á和 ä有相同的排序優先權。要匹配它們中的一個,等價類為[=a=]。
POSIX字元集

描述
擴展
[: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:]
標點字元
[-!"#$%&'( )*+,./:;<=>?@[\\\]^_'{|}~]

相關詞條

熱門詞條

聯絡我們