正規表示式之捕獲型分組與非捕獲型分組

2021-06-29 16:20:18 字數 3318 閱讀 8434

使用小括號指定乙個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其它程式中作進一步的處理。

捕獲組 

語法: 

字元

描述

示例

(pattern)

匹配pattern並捕獲結果,自動設定組號。

(abc)+d

匹配abcd或者abcabcd

(?pattern)

或(?'name'pattern)

匹配pattern並捕獲結果,設定name為組名。

\num

對捕獲組的反向引用。其中 num 是乙個正整數。

(\w)(\w)\2\1

匹配abba

\k或\k'name '

對命名捕獲組的反向引用。其中 name 是捕獲組名。

(?\w)abc\k

匹配xabcx

使用小括號指定乙個子表示式後,匹配這個子表示式的文字(也就是此分組捕獲的內容)可以在表示式或其它程式中作進一步的處理。預設情況下,每個捕獲組會自動擁有乙個組號,規則是:從左向右,以分組的左括號為標誌,第乙個出現的分組的組號為1,第二個為2,以此類推。 

例如: 

(\d)-(\d-(\d)) 

1 1 2 3 32 

以下是用程式處理捕獲組的示例,對乙個url位址進行解析,並顯示所有捕獲組。 

可以看到按順序設定的捕獲組號。 

regex.match方法 

複製**

**如下:

也可以自己指定子表示式的組名。這樣在表示式或程式中可以直接引用組名,當然也可以繼續使用組號。但如果正規表示式中同時存在普通捕獲組和命名捕獲組,那麼捕獲組的編號就要特別注意,編號的規則是先對普通捕獲組進行編號,再對命名捕獲組進行編號。 

例如: 

(\d)-(?\d-(\d)) 

1 1 3 2 23 

下面在程式中處理命名捕獲組,顯示混合規則生成的組號,並利用捕獲組的內容對源字串進行替換。 

可以看到先對普通捕獲組進行編號,再對命名捕獲組編號。 

regex.replace方法 

複製**

**如下:

using system.text.regularexpressions; 

namespace wuhong.test 

: ", i, m.groups[i])); 

} } 

//替換字串 

//「$組號」引用捕獲組的內容。 

//需要特別注意的是「$組號」後不能跟數字形式的字串,如果出現此情況,需要使用命名捕獲組,引用格式「$」 

非捕獲組

語法:字元

描述

示例

(?:pattern)

匹配pattern,但不捕獲匹配結果。

'industr(?:y|ies)

匹配'industry'或'industries'。

(?=pattern)

零寬度正向預查,不捕獲匹配結果。

'windows (?=95|98|nt|2000)'

匹配 "windows2000" 中的 "windows"

不匹配 "windows3.1" 中的 "windows"。

(?!pattern)

零寬度負向預查,不捕獲匹配結果。

'windows (?!95|98|nt|2000)'

匹配 "windows3.1" 中的 "windows"

不匹配 "windows2000" 中的 "windows"。

(?<=pattern)

零寬度正向回查,不捕獲匹配結果。

'2000 (?<=office|word|excel)'

匹配 " office2000" 中的 "2000"

不匹配 "windows2000" 中的 "2000"。

(?pattern)

零寬度負向回查,不捕獲匹配結果。

'2000 (?匹配 " windows2000" 中的 "2000"

不匹配 " office2000" 中的 "2000"。

非捕獲組只匹配結果,但不捕獲結果,也不會分配組號,當然也不能在表示式和程式中做進一步處理。 

首先(?:pattern)與(pattern)不同之處只是在於不捕獲結果。 

接下來的四個非捕獲組用於匹配pattern(或者不匹配pattern)位置之前(或之後)的內容。匹配的結果不包括pattern。 

例如: 

(?<=).*(?=)匹配不包含屬性的簡單html標籤內的內容。如:hello

之中的hello,匹配結果不包括字首和字尾。 

下面是程式中非捕獲組的示例,用來提取郵編。 

可以看到反向回查和反向預查都沒有**獲。 

regex.matches方法 

複製**

**如下:

using system.text.regularexpressions; 

namespace wuhong.test 

{ class program 

{ static void main(string args) 

{ //目標字串 

string source = "有6組數字:010001,100,21000,310000,4100011,510002,把郵編挑出來。";

//正則式 

string regex = @"(?原文**:

正規表示式 非捕獲分組

目前為止,總共介紹了括號的三種用途 分組,將相關的語速歸攏到一起,構成單個元素 多選結構,規定可能出現的多個子表達示 引用分組,將子表示式匹配的文字儲存起來,供之後引用。這三種用途並不是彼此獨立的,而是互相重疊的 單純的分組可以視為 只包含乙個多選分支的多選結構 整個多選結構也會被視為單個元素,可以...

正規表示式 分組與捕獲

之前使用正規表示式的時候大多數狀況下只是用用匹配表示式,為什麼說是匹配表示式呢,因為其實替換文字也可以使用表示式,我稱之為替換表示式。因為通常使用正規表示式的大多會是以下情況,比如把一段文字中的a字串更改為b字串 待匹配文字 abcdabcd 匹配表示式 b 替換文字 e 替換結果 aecdaecd...

正規表示式 分組與捕獲

之前使用正規表示式的時候大多數狀況下只是用用匹配表示式,為什麼說是匹配表示式呢,因為其實替換文字也可以使用表示式,我稱之為替換表示式。因為通常使用正規表示式的大多會是以下情況,比如把一段文字中的a字串更改為b字串 待匹配文字 abcdabcd 匹配表示式 b 替換文字 e 替換結果 aecdaecd...