規則運算式中的字元類別- .NET - Microsoft Docs

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

範例將使用子運算式 [A-Z] 表示從A 到Z 的大寫字母範圍。

C# ... see the "ECMAScript Matching Behavior" section in Regular Expression Options. 跳到主要內容 已不再支援此瀏覽器。

請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。

下載MicrosoftEdge 其他資訊 目錄 結束焦點模式 語言 閱讀英文 儲存 目錄 閱讀英文 儲存 Twitter LinkedIn Facebook 電子郵件 目錄 規則運算式中的字元類別 發行項 06/23/2022 20位參與者 本文內容 字元類別會定義一組字元,其中任何字元都可在輸入字串中出現,以便讓比對成功。

.NET中的規則運算式語言支援下列字元類別: 正字元群組。

輸入字串中的字元必須符合指定字元集的其中一個字元。

如需詳細資訊,請參閱正字元群組。

負字元群組。

輸入字串中的字元不得符合指定字元集的其中一個字元。

如需詳細資訊,請參閱負字元群組。

任何字元。

在規則運算式中的.(點或句號)字元是萬用字元,可符合\n以外的任何字元。

如需詳細資訊,請參閱任何字元。

一般Unicode分類或具名區塊。

輸入字串中的字元必須是特定Unicode分類的成員,或者必須落在Unicode字元的連續範圍內,比對才會成功。

如需詳細資訊,請參閱Unicode類別或Unicode區塊。

負的一般Unicode分類或是具名區塊。

輸入字串中的字元不得是特定Unicode分類的成員,或者不得落在Unicode字元的連續範圍內,比對才會成功。

如需詳細資訊,請參閱負Unicode類別或Unicode區塊。

文字字元。

輸入字串中的字元可以隸屬於任何適用於文字字元的Unicode分類。

如需詳細資訊,請參閱Word字元。

非文字字元。

輸入字串中的字元可以隸屬於任何非文字字元的Unicode分類。

如需詳細資訊,請參閱非文字字元。

空白字元。

輸入字串中的字元可以是任何Unicode分隔符號字元,以及任何一種控制字元。

如需詳細資訊,請參閱空白字元。

非空白字元。

輸入字串中的字元可以是空白字元以外的任何字元。

如需詳細資訊,請參閱非空白字元。

十進位數字。

輸入字串中的字元可以是歸類為Unicode十進位數字的任何一個數字字元。

如需詳細資訊,請參閱十進位數位符。

非十進位數字。

輸入字串中的字元可以是Unicode十進位數字以外的任何字元。

如需詳細資訊,請參閱十進位數位符。

.NET支援字元類別減法運算式,可讓您將一組字元定義為從某個字元類別中排除另一個字元類別的結果。

如需詳細資訊,請參閱字元類別減法。

注意 依類別比對字元的字元類別,例如\w以比對文字字元或\p{}來比對Unicode類別,依賴CharUnicodeInfo類別來提供字元類別的相關資訊。

在.NETFramework4.6.2和更新版本中,字元類別是以UnicodeStandard8.0.0版為基礎。

正字元群組:[] 正字元群組會指定一份字元清單,其中任何字元都可出現在輸入字串中,以便出現相符項目。

這份字元清單可以個別指定,也可以依範圍指定,或同時依兩種方式指定。

指定個別字元清單的語法如下所示: [*character_group*] 其中character_group是為了讓比對成功而可以出現在輸入字串中的個別字元清單。

character_group可以包含一或多個常值字元、逸出字元或字元類別的任何組合。

指定字元範圍的語法如下所示: [firstCharacter-lastCharacter] 其中firstCharacter是開始範圍的字元,而lastCharacter是結束範圍的字元。

字元範圍是指一系列連續的字元,定義的方式是指定系列中的第一個字元、連字號(-),然後是系列中的最後一個字元。

如果兩個字元具有相鄰的Unicode字碼指標,這兩個字元就是連續字元。

firstCharacter必須是較低字碼指標的字元,lastCharacter必須是較高字碼指標的字元。

注意 由於正字元群組可以包含一組字元和一個範圍的字元,因此連字號字元(-)會一律解譯成範圍分隔符號,除非該字元是群組的第一個或最後一個字元。

下表列出一些包含正字元類別的常見規則運算式模式。

模式 描述 [aeiou] 比對所有母音。

[\p{P}\d] 比對所有標點符號和十進位數字字元。

[\s\p{P}] 比對所有空白字元與標點符號。

下列範例會定義包含字元"a"和"e"的正字元群組,因此輸入字串必須包含文字"grey"或"gray"且後面接著另一個文字,才會出現相符項目。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"gr[ae]y\s\S+?[\s\p{P}]"; stringinput="Thegraywolfjumpedoverthegreywall."; MatchCollectionmatches=Regex.Matches(input,pattern); foreach(Matchmatchinmatches) Console.WriteLine($"'{match.Value}'"); } } //Theexampledisplaysthefollowingoutput: //'graywolf' //'greywall.' ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="gr[ae]y\s\S+?[\s\p{P}]" DiminputAsString="Thegraywolfjumpedoverthegreywall." DimmatchesAsMatchCollection=Regex.Matches(input,pattern) ForEachmatchAsMatchInmatches Console.WriteLine($"'{match.Value}'") Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: ''graywolf' ''greywall.' 規則運算式gr[ae]y\s\S+?[\s|\p{P}]定義如下: 模式 描述 gr 比對常值字元"gr"。

[ae] 比對"a"或"e"。

y\s 比對後面接著空白字元的常值字元"y"。

\S+? 比對一個或多個非空白字元,但越少越好。

[\s\p{P}] 比對空白字元或標點符號。

下列範例將比對以任何大寫字母開頭的文字。

範例將使用子運算式[A-Z]表示從A到Z的大寫字母範圍。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"\b[A-Z]\w*\b"; stringinput="AcityAlbanyZulumaritimeMarseilles"; foreach(MatchmatchinRegex.Matches(input,pattern)) Console.WriteLine(match.Value); } } //Theexampledisplaysthefollowingoutput: //A //Albany //Zulu //Marseilles ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="\b[A-Z]\w*\b" DiminputAsString="AcityAlbanyZulumaritimeMarseilles" ForEachmatchAsMatchInRegex.Matches(input,pattern) Console.WriteLine(match.Value) Next EndSub EndModule 規則運算式\b[A-Z]\w*\b的定義如下表所示。

模式 描述 \b 從字緣開始。

[A-Z] 比對從A到Z的任何大寫字元。

\w* 比對零個或多個文字字元。

\b 比對字邊界。

負字元群組:[^] 負字元群組會指定一份字元清單,其中任何字元不得出現在輸入字串中,才會出現相符項目。

字元清單可以個別指定,也可以依範圍指定,或同時依兩種方式指定。

指定個別字元清單的語法如下所示: [*^character_group*] 其中character_group是為了讓比對成功而不可出現在輸入字串中的個別字元清單。

character_group可以包含一或多個常值字元、逸出字元或字元類別的任何組合。

指定字元範圍的語法如下所示: [^*firstCharacter*-*lastCharacter*] 其中firstCharacter是開始範圍的字元,而lastCharacter是結束範圍的字元。

字元範圍是指一系列連續的字元,定義的方式是指定系列中的第一個字元、連字號(-),然後是系列中的最後一個字元。

如果兩個字元具有相鄰的Unicode字碼指標,這兩個字元就是連續字元。

firstCharacter必須是較低字碼指標的字元,lastCharacter必須是較高字碼指標的字元。

注意 由於負字元群組可以包含一組字元和一個範圍的字元,因此連字號字元(-)會一律解譯成範圍分隔符號,除非該字元是群組的第一個或最後一個字元。

可以串連兩個或多個字元範圍。

例如,若要指定從"0"到"9"的十進位數字範圍、從"a"到"f"的小寫字母範圍,以及從"A"到"F"的大寫字母範圍,可以使用[0-9a-fA-F]。

負字元群組中的前置插入號字元(^)是必要的,表示字元群組是負字元群組,而不是正字元群組。

重要 較大規則運算式模式中的負字元群組不是零寬度的判斷提示。

也就是說,在評估負字元群組之後,規則運算式引擎會在輸入字串中前進一個字元。

下表列出一些包含負字元群組的常見規則運算式模式。

模式 描述 [^aeiou] 比對除了母音之外的所有字元。

[^\p{P}\d] 比對標點符號和十進位數字字元之外的所有字元。

下列範例將比對任何開頭字元是"th"且後面不是接著"o"的文字。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"\bth[^o]\w+\b"; stringinput="thoughtthingthoughthemthroughthusthoroughthis"; foreach(MatchmatchinRegex.Matches(input,pattern)) Console.WriteLine(match.Value); } } //Theexampledisplaysthefollowingoutput: //thing //them //through //thus //this ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="\bth[^o]\w+\b" DiminputAsString="thoughtthingthoughthemthroughthus"+_ "thoroughthis" ForEachmatchAsMatchInRegex.Matches(input,pattern) Console.WriteLine(match.Value) Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: 'thing 'them 'through 'thus 'this 規則運算式\bth[^o]\w+\b的定義如下表所示。

模式 描述 \b 從字緣開始。

th 比對常值字元"th"。

[^o] 比對不是"o"的任何字元。

\w+ 比對一個或多個文字字元。

\b 在字邊界結束。

任何字元:. 句號字元(.)會比對\n(新行字元\u000A)以外任何具有下列兩項資格的字元: 如果RegexOptions.Singleline選項修改了規則運算式模式,或是.選項修改了模式中包含s字元類別的部分,.就會符合任何字元。

如需詳細資訊,請參閱正則運算式選項。

下列範例將示範.字元類別的預設行為與使用RegexOptions.Singleline選項的行為有何不同。

規則運算式^.+會從字串開頭開始,比對每一個字元。

根據預設,比對會在第一行結尾結束。

規則運算式模式會比對歸位字元\r或\u000D,但不會比對\n。

由於RegexOptions.Singleline選項會將整個輸入字串解譯為單行,因此它會比對輸入字串中的每個字元,包括\n。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern="^.+"; stringinput="Thisisonelineand"+Environment.NewLine+"thisisthesecond."; foreach(MatchmatchinRegex.Matches(input,pattern)) Console.WriteLine(Regex.Escape(match.Value)); Console.WriteLine(); foreach(MatchmatchinRegex.Matches(input,pattern,RegexOptions.Singleline)) Console.WriteLine(Regex.Escape(match.Value)); } } //Theexampledisplaysthefollowingoutput: //This\is\one\line\and\r // //This\is\one\line\and\r\nthis\is\the\second\. ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="^.+" DiminputAsString="Thisisonelineand"+vbCrLf+"thisisthesecond." ForEachmatchAsMatchInRegex.Matches(input,pattern) Console.WriteLine(Regex.Escape(match.Value)) Next Console.WriteLine() ForEachmatchAsMatchInRegex.Matches(input,pattern,RegexOptions.SingleLine) Console.WriteLine(Regex.Escape(match.Value)) Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: 'This\is\one\line\and\r ' 'This\is\one\line\and\r\nthis\is\the\second\. 注意 由於它會比對\n以外的任何字元,因此.字元類別也會比對\r(歸位字元\u000D)。

在正或負字元群組中,句號會視為常值句號字元而非字元類別。

如需詳細資訊,請參閱本主題前段的正字元群組和負字元群組。

下列範例將進行示範,定義包含句號字元(.)做為字元類別以及做為正字元群組成員的規則運算式。

規則運算式\b.*[.?!;:](\s|\z)會從字邊界開始比對所有字元,直到遇到包括句號的五個標點符號其中之一,然後比對空白字元或字串結尾。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"\b.*[.?!;:](\s|\z)"; stringinput="this.what:is?go,thing."; foreach(MatchmatchinRegex.Matches(input,pattern)) Console.WriteLine(match.Value); } } //Theexampledisplaysthefollowingoutput: //this.what:is?go,thing. ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsSTring="\b.*[.?!;:](\s|\z)" DiminputAsString="this.what:is?go,thing." ForEachmatchAsMatchInRegex.Matches(input,pattern) Console.WriteLine(match.Value) Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: 'this.what:is?go,thing. 注意 由於它會比對任何字元,因此如果規則運算式模式嘗試多次比對任何字元,.語言項目就會經常與lazy數量詞搭配使用。

如需詳細資訊,請參閱數量詞。

Unicode類別或Unicode區塊:\p{} Unicode標準會為每個字元指派一種一般分類。

例如,特定字元可以是大寫字母(以Lu分類表示)、十進位數字(Nd分類)、數學符號(Sm分類)或段落分隔符號(Zl分類)。

Unicode標準中的特定字元集也會佔據連續字碼指標的特定範圍或區塊。

例如,從\u0000到\u007F可找到基本拉丁字元集,從\u0600到\u06FF則可找到阿拉伯字元集。

規則運算式建構 \p{名字} 會比對任何屬於Unicode一般類別或具名區塊的字元,其中name是類別縮寫或具名區塊名稱。

Foralistofcategoryabbreviations,seetheSupportedUnicodeGeneralCategoriessectionlaterinthistopic.如需具名區塊的清單,請參閱本主題稍後的支援具名區塊一節。

下列範例會\p{使用name}建構來比對Unicode一般類別(在此案例中Pd為、或標點符號、虛線類別)和具名區塊(IsGreek和IsBasicLatin具名區塊)。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"\b(\p{IsGreek}+(\s)?)+\p{Pd}\s(\p{IsBasicLatin}+(\s)?)+"; stringinput="ΚαταΜαθθαίον-TheGospelofMatthew"; Console.WriteLine(Regex.IsMatch(input,pattern));//DisplaysTrue. } } ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="\b(\p{IsGreek}+(\s)?)+\p{Pd}\s(\p{IsBasicLatin}+(\s)?)+" DiminputAsString="ΚαταΜαθθαίον-TheGospelofMatthew" Console.WriteLine(Regex.IsMatch(input,pattern))'DisplaysTrue. EndSub EndModule 規則運算式\b(\p{IsGreek}+(\s)?)+\p{Pd}\s(\p{IsBasicLatin}+(\s)?)+的定義如下表所示。

模式 描述 \b 從字緣開始。

\p{IsGreek}+ 比對一個或多個希臘字元。

(\s)? 比對零個或一個空白字元。

(\p{IsGreek}+(\s)?)+ 一次或多次比對一個或多個希臘字元後面接著零或一個空白字元的模式。

\p{Pd} 比對標點符號、虛線字元。

\s 比對空白字元。

\p{IsBasicLatin}+ 比對一個或多個基本拉丁字元。

(\s)? 比對零個或一個空白字元。

(\p{IsBasicLatin}+(\s)?)+ 一次或多次比對一個或多個基本拉丁字元後面接著零個或一個空白字元的模式。

負Unicode類別或Unicode區塊:\P{} Unicode標準會為每個字元指派一種一般分類。

例如,特定字元可以是大寫字母(以Lu分類表示)、十進位數字(Nd分類)、數學符號(Sm分類)或段落分隔符號(Zl分類)。

Unicode標準中的特定字元集也會佔據連續字碼指標的特定範圍或區塊。

例如,從\u0000到\u007F可找到基本拉丁字元集,從\u0600到\u06FF則可找到阿拉伯字元集。

規則運算式建構 \P{名字} 比對任何不屬於Unicode一般分類或具名區塊的字元,其中name是分類縮寫或是具名區塊名稱。

Foralistofcategoryabbreviations,seetheSupportedUnicodeGeneralCategoriessectionlaterinthistopic.如需具名區塊的清單,請參閱本主題稍後的支援具名區塊一節。

下列範例會\P{使用name}建構,從數值字串中移除任何貨幣符號(、Sc、或符號、貨幣類別)。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"(\P{Sc})+"; string[]values={"$164,091.78","£1,073,142.68","73¢","€120"}; foreach(stringvalueinvalues) Console.WriteLine(Regex.Match(value,pattern).Value); } } //Theexampledisplaysthefollowingoutput: //164,091.78 //1,073,142.68 //73 //120 ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="(\P{Sc})+" Dimvalues()AsString={"$164,091.78","£1,073,142.68","73¢","€120"} ForEachvalueAsStringInvalues Console.WriteLine(Regex.Match(value,pattern).Value) Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: '164,091.78 '1,073,142.68 '73 '120 規則運算式模式(\P{Sc})+會比對一個或多個不是貨幣符號的字元,並且會有效移除結果字串中的所有貨幣符號。

文字字元:\w \w會比對任何文字字元。

文字字元是下表中所列的任何Unicode分類的成員。

類別 描述 Ll Letter,Lowercase Lu 字母、大寫 Lt 字母、字首大寫 Lo 字母、其他 Lm 字母、修飾詞 Mn 記號,非間距 Nd 數字、十進位數字 Pc 標點符號、連接器。

這個分類包含十個字元,其中最常用的是LOWLINE字元(_),u+005F。

如果指定了符合ECMAScript的行為,\w就等於[a-zA-Z_0-9]。

ForinformationonECMAScriptregularexpressions,seethe"ECMAScriptMatchingBehavior"sectioninRegularExpressionOptions. 注意 由於它會比對任何文字字元,因此,如果規則運算式模式嘗試多次比對任何文字字元且後面接著特定文字字元,\w語言項目就會經常與lazy數量詞搭配使用。

如需詳細資訊,請參閱數量詞。

下列範例會使用\w語言項目比對文字中重複的字元。

這個範例會定義規則運算式模式(\w)\1,該模式解譯如下。

元素 描述 (\w) 比對文字字元。

這是第一個擷取群組。

\1 比對第一個擷取的值。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"(\w)\1"; string[]words={"trellis","seer","latter","summer", "hoarse","lesser","aardvark","stunned"}; foreach(stringwordinwords) { Matchmatch=Regex.Match(word,pattern); if(match.Success) Console.WriteLine("'{0}'foundin'{1}'atposition{2}.", match.Value,word,match.Index); else Console.WriteLine("Nodoublecharactersin'{0}'.",word); } } } //Theexampledisplaysthefollowingoutput: //'ll'foundin'trellis'atposition3. //'ee'foundin'seer'atposition1. //'tt'foundin'latter'atposition2. //'mm'foundin'summer'atposition2. //Nodoublecharactersin'hoarse'. //'ss'foundin'lesser'atposition2. //'aa'foundin'aardvark'atposition0. //'nn'foundin'stunned'atposition3. ImportsSystem.Text.RegularExpressions ModuleExample PublicSubMain() DimpatternAsString="(\w)\1" Dimwords()AsString={"trellis","seer","latter","summer",_ "hoarse","lesser","aardvark","stunned"} ForEachwordAsStringInwords DimmatchAsMatch=Regex.Match(word,pattern) Ifmatch.SuccessThen Console.WriteLine("'{0}'foundin'{1}'atposition{2}.",_ match.Value,word,match.Index) Else Console.WriteLine("Nodoublecharactersin'{0}'.",word) EndIf Next EndSub EndModule 'Theexampledisplaysthefollowingoutput: ''ll'foundin'trellis'atposition3. ''ee'foundin'seer'atposition1. ''tt'foundin'latter'atposition2. ''mm'foundin'summer'atposition2. 'Nodoublecharactersin'hoarse'. ''ss'foundin'lesser'atposition2. ''aa'foundin'aardvark'atposition0. ''nn'foundin'stunned'atposition3. 非文字字元:\W \W會比對任何非文字字元。

\W語言項目相當於下列字元類別: [^\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Nd}\p{Pc}\p{Lm}] 換句話說,它會比對下表所列Unicode分類中字元以外的所有字元。

類別 描述 Ll Letter,Lowercase Lu 字母、大寫 Lt 字母、字首大寫 Lo 字母、其他 Lm 字母、修飾詞 Mn 記號,非間距 Nd 數字、十進位數字 Pc 標點符號、連接器。

這個分類包含十個字元,其中最常用的是LOWLINE字元(_),u+005F。

如果指定了符合ECMAScript的行為,\W就等於[^a-zA-Z_0-9]。

ForinformationonECMAScriptregularexpressions,seethe"ECMAScriptMatchingBehavior"sectioninRegularExpressionOptions. 注意 由於它會比對任何非文字字元,因此,如果規則運算式模式嘗試多次比對任何非文字字元,且後面接著特定非文字字元,\W語言項目就會經常與lazy數量詞搭配使用。

如需詳細資訊,請參閱數量詞。

以下範例將說明\W字元類別。

它會定義規則運算式模式\b(\w+)(\W){1,2},該模式會比對後面接一個或多個非文字字元的文字,例如空白字元或標點符號。

規則運算式的解譯方式如下表所示。

元素 描述 \b 開始字緣比對。

(\w+) 比對一個或多個文字字元。

這是第一個擷取群組。

(\W){1,2} 比對一次或兩次非文字字元。

這是第二個擷取群組。

usingSystem; usingSystem.Text.RegularExpressions; publicclassExample { publicstaticvoidMain() { stringpattern=@"\b(\w+)(\W){1,2}"; stringinput="Theold,greymareslowlywalkedacrossthenarrow,greenpasture."; foreach(MatchmatchinRegex.Matches(input,pattern)) { Console.WriteLine(match.Value); Console.Write("Non-wordcharacter(s):"); CaptureCollectioncaptures=match.Groups[2].Captures; for(intctr=0;ctr



請為這篇文章評分?