a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > regex > 正文

正則表達式之捕獲組/非捕獲組介紹

2020-01-20 22:16:37
字體:
來源:轉載
供稿:網友
捕獲組
語法:

字符 

描述

示例

(pattern)

匹配pattern并捕獲結果,自動設置組號。

 (abc)+d

匹配abcd或者abcabcd

(?<name>pattern)

(?'name'pattern)

匹配pattern并捕獲結果,設置name為組名。

 

/num

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

(/w)(/w)/2/1

匹配abba

/k< name >

/k' name '

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

(?<group>/w)abc/k<group>

匹配xabcx

使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個捕獲組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推。
例如:
(/d{4})-(/d{2}-(/d{2}))
1 1 2 3 32
以下是用程序處理捕獲組的示例,對一個Url地址進行解析,并顯示所有捕獲組。
可以看到按順序設置的捕獲組號。
Regex.Match方法
復制代碼 代碼如下:

using System.Text.RegularExpressions;
namespace Wuhong.Test
{
class Program
{
static void Main(string[] args)
{
//目標字符串
string source = "http://reg-test-server:8080/download/file1.html# ";
//正則式
string regex = @"(/w+):////([^/:]+)(:/d+)?([^# :]*)";
Regex regUrl = new Regex(regex);
//匹配正則表達式
Match m = regUrl.Match(source);
Console.WriteLine(m.Success);
if (m.Success)
{
//捕獲組存放在Match.Groups集合中,索引值從1開始,索引0處為匹配的整個字符串值
//按“組號 : 捕獲內容”的格式顯示
for (int i = 0; i < m.Groups.Count; i++)
{
Console.WriteLine(string.Format("{0} : {1}", i, m.Groups[i]));
}
}
Console.ReadLine();
}
}
}

也可以自己指定子表達式的組名。這樣在表達式或程序中可以直接引用組名,當然也可以繼續使用組號。但如果正則表達式中同時存在普通捕獲組和命名捕獲組,那么捕獲組的編號就要特別注意,編號的規則是先對普通捕獲組進行編號,再對命名捕獲組進行編號。
例如:
(/d{4})-(?<date>/d{2}-(/d{2}))
1 1 3 2 23

下面在程序中處理命名捕獲組,顯示混合規則生成的組號,并利用捕獲組的內容對源字符串進行替換。
可以看到先對普通捕獲組進行編號,再對命名捕獲組編號。
Regex.Replace方法
復制代碼 代碼如下:

using System.Text.RegularExpressions;
namespace Wuhong.Test
{
class Program
{
static void Main(string[] args)
{
//目標字符串
string source = "http://reg-test-server:8080/download/file1.html# ";
//正則式,對其中兩個分組命名
string regex = @"(/w+):////(?<server>[^/:]+)(?<port>:/d+)?([^# :]*)";
Regex regUrl = new Regex(regex);
//匹配正則表達式
Match m = regUrl.Match(source);
Console.WriteLine(m.Success);
if (m.Success)
{
//捕獲組存放在Match.Groups集合中,索引值從1開始,索引0處為匹配的整個字符串值
//按“組號 : 捕獲內容”的格式顯示
for (int i = 0; i < m.Groups.Count; i++)
{
Console.WriteLine(string.Format("{0} : {1}", i, m.Groups[i]));
}
}
//替換字符串
//“$組號”引用捕獲組的內容。
//需要特別注意的是“$組號”后不能跟數字形式的字符串,如果出現此情況,需要使用命名捕獲組,引用格式“${組名}”
string replacement = string.Format("$1://{0}{1}$2", "new-reg-test-server", "");
string result = regUrl.Replace(source, replacement);
Console.WriteLine(result);
Console.ReadLine();
}
}
}


非捕獲組
語法:

字符 

描述

示例

(?: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 (?<!Office|Word|Excel)'

匹配 " Windows2000" 中的 "2000"

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


非捕獲組只匹配結果,但不捕獲結果,也不會分配組號,當然也不能在表達式和程序中做進一步處理。
首先(?:pattern)與(pattern)不同之處只是在于不捕獲結果。
接下來的四個非捕獲組用于匹配pattern(或者不匹配pattern)位置之前(或之后)的內容。匹配的結果不包括pattern。
例如:
(?<=<(/w+)>).*(?=<///1>)匹配不包含屬性的簡單HTML標簽內的內容。如:<div>hello</div>之中的hello,匹配結果不包括前綴<div>和后綴</div>。
下面是程序中非捕獲組的示例,用來提取郵編。
可以看到反向回查和反向預查都沒有被捕獲。
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 = @"(?<!/d)([1-9]/d{5})(?!/d)";
Regex regUrl = new Regex(regex);
//獲取所有匹配
MatchCollection mList = regUrl.Matches(source);
for (int j = 0; j < mList.Count; j++)
{
//顯示每個分組,可以看到每個分組都只有組號為1的項,反向回查和反向預查沒有被捕獲
for (int i = 0; i < mList[j].Groups.Count; i++)
{
Console.WriteLine(string.Format("{0} : {1} : {2}", j, i, mList[j].Groups[i]));
}
}
Console.ReadLine();
}
}
}


注釋
語法:

字符

描述

示例

(?#comment)

comment是注釋,不對正則表達式的處理產生任何影響

2[0-4]/d(?#200-249)|25[0-5](?#250-255)|1?/d/d?(?#0-199)

匹配0-255的整數

這個不解釋了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一区二区影视 | 二区视频 | 一级少妇片 | 视频一区欧美 | 国产高清成人久久 | 国产精品区二区三区日本 | 国产a视频 | 精品一区免费 | 精品国产黄色 | 精品久久久免费视频 | 四虎影视在线 | 日韩av在线电影 | 久久人久久 | 亚洲一区二区在线免费观看 | 91麻豆精品国产91久久久久久 | 成全视频免费观看在线看黑人 | 国产精品99久久久久久宅男 | 狠狠干美女| 久久一| 一区二区三区在线播放 | 国产一区二区三区免费 | 激情久久av一区av二区av三区 | 毛片aaaaa| 精品久久久久久国产 | 一本岛在线视频 | 国产婷婷精品av在线 | 国产综合精品一区二区三区 | 精品视频在线观看 | 国产中文字幕一区二区 | 日韩一区欧美一区 | 久久久久久久久久久久福利 | 日韩久久久久久久久久 | 欧美日韩国产一区二区三区不卡 | 福利视频网址导航 | 国产精品一区二区在线看 | 欧美日韩免费一区二区三区 | 国产高清第一页 | h肉动漫无修一区二区无遮av | 瑟瑟网站在线观看 | 精品久久久久久亚洲精品 | 一级大片av |