正則表達(dá)式之捕獲組/非捕獲組介紹
語法:
字符 |
描述 |
示例 |
(pattern) |
匹配pattern并捕獲結(jié)果,自動(dòng)設(shè)置組號(hào)。 |
(abc)+d 匹配abcd或者abcabcd |
(?<name>pattern) 或 (?'name'pattern) |
匹配pattern并捕獲結(jié)果,設(shè)置name為組名。 |
|
\num |
對(duì)捕獲組的反向引用。其中 num 是一個(gè)正整數(shù)。 |
(\w)(\w)\2\1 匹配abba |
\k< name > 或 \k' name ' |
對(duì)命名捕獲組的反向引用。其中 name 是捕獲組名。 |
(?<group>\w)abc\k<group> 匹配xabcx |
例如:
(\d{4})-(\d{2}-(\d{2}))
1 1 2 3 32
以下是用程序處理捕獲組的示例,對(duì)一個(gè)Url地址進(jìn)行解析,并顯示所有捕獲組。
可以看到按順序設(shè)置的捕獲組號(hào)。
Regex.Match方法
using System.Text.RegularExpressions;
namespace Wuhong.Test
{
class Program
{
static void Main(string[] args)
{
//目標(biāo)字符串
string source = "http://reg-test-server:8080/download/file1.html# ";
//正則式
string regex = @"(\w+):\/\/([^/:]+)(:\d+)?([^# :]*)";
Regex regUrl = new Regex(regex);
//匹配正則表達(dá)式
Match m = regUrl.Match(source);
Console.WriteLine(m.Success);
if (m.Success)
{
//捕獲組存放在Match.Groups集合中,索引值從1開始,索引0處為匹配的整個(gè)字符串值
//按“組號(hào) : 捕獲內(nèi)容”的格式顯示
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
下面在程序中處理命名捕獲組,顯示混合規(guī)則生成的組號(hào),并利用捕獲組的內(nèi)容對(duì)源字符串進(jìn)行替換。
可以看到先對(duì)普通捕獲組進(jìn)行編號(hào),再對(duì)命名捕獲組編號(hào)。
Regex.Replace方法
using System.Text.RegularExpressions;
namespace Wuhong.Test
{
class Program
{
static void Main(string[] args)
{
//目標(biāo)字符串
string source = "http://reg-test-server:8080/download/file1.html# ";
//正則式,對(duì)其中兩個(gè)分組命名
string regex = @"(\w+):\/\/(?<server>[^/:]+)(?<port>:\d+)?([^# :]*)";
Regex regUrl = new Regex(regex);
//匹配正則表達(dá)式
Match m = regUrl.Match(source);
Console.WriteLine(m.Success);
if (m.Success)
{
//捕獲組存放在Match.Groups集合中,索引值從1開始,索引0處為匹配的整個(gè)字符串值
//按“組號(hào) : 捕獲內(nèi)容”的格式顯示
for (int i = 0; i < m.Groups.Count; i++)
{
Console.WriteLine(string.Format("{0} : {1}", i, m.Groups[i]));
}
}
//替換字符串
//“$組號(hào)”引用捕獲組的內(nèi)容。
//需要特別注意的是“$組號(hào)”后不能跟數(shù)字形式的字符串,如果出現(xiàn)此情況,需要使用命名捕獲組,引用格式“${組名}”
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,但不捕獲匹配結(jié)果。 |
'industr(?:y|ies) 匹配'industry'或'industries'。 |
(?=pattern) |
零寬度正向預(yù)查,不捕獲匹配結(jié)果。 |
'Windows (?=95|98|NT|2000)' 匹配 "Windows2000" 中的 "Windows" 不匹配 "Windows3.1" 中的 "Windows"。 |
(?!pattern) |
零寬度負(fù)向預(yù)查,不捕獲匹配結(jié)果。 |
'Windows (?!95|98|NT|2000)' 匹配 "Windows3.1" 中的 "Windows" 不匹配 "Windows2000" 中的 "Windows"。 |
(?<=pattern) |
零寬度正向回查,不捕獲匹配結(jié)果。 |
'2000 (?<=Office|Word|Excel)' 匹配 " Office2000" 中的 "2000" 不匹配 "Windows2000" 中的 "2000"。 |
(?<!pattern) |
零寬度負(fù)向回查,不捕獲匹配結(jié)果。 |
'2000 (?<!Office|Word|Excel)' 匹配 " Windows2000" 中的 "2000" 不匹配 " Office2000" 中的 "2000"。 |
非捕獲組只匹配結(jié)果,但不捕獲結(jié)果,也不會(huì)分配組號(hào),當(dāng)然也不能在表達(dá)式和程序中做進(jìn)一步處理。
首先(?:pattern)與(pattern)不同之處只是在于不捕獲結(jié)果。
接下來的四個(gè)非捕獲組用于匹配pattern(或者不匹配pattern)位置之前(或之后)的內(nèi)容。匹配的結(jié)果不包括pattern。
例如:
(?<=<(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標(biāo)簽內(nèi)的內(nèi)容。如:<div>hello</div>之中的hello,匹配結(jié)果不包括前綴<div>和后綴</div>。
下面是程序中非捕獲組的示例,用來提取郵編。
可以看到反向回查和反向預(yù)查都沒有被捕獲。
Regex.Matches方法
using System.Text.RegularExpressions;
namespace Wuhong.Test
{
class Program
{
static void Main(string[] args)
{
//目標(biāo)字符串
string source = "有6組數(shù)字: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++)
{
//顯示每個(gè)分組,可以看到每個(gè)分組都只有組號(hào)為1的項(xiàng),反向回查和反向預(yù)查沒有被捕獲
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是注釋,不對(duì)正則表達(dá)式的處理產(chǎn)生任何影響 |
2[0-4]\d(?#200-249)|25[0-5](?#250-255)|1?\d\d?(?#0-199) 匹配0-255的整數(shù) |
相關(guān)文章
shell腳本之正則表達(dá)式、grep、sed、awk
這篇文章主要介紹了shell腳本之正則表達(dá)式、grep、sed、awk的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04Javascript 字符串字節(jié)長度計(jì)算函數(shù)代碼與效率分析(for VS 正則)
下面的函數(shù)都是用于計(jì)算字符串長度,英文算一個(gè),中文算兩個(gè)。效果一樣,效率卻未必一樣,大家可以自行選擇下。2009-12-12JS正則表達(dá)式驗(yàn)證數(shù)字(非常全)
正則表達(dá)式,又稱規(guī)則表達(dá)式,在項(xiàng)目中經(jīng)常會(huì)用到正則表達(dá)式,今天小編抽空給大家分享js正則表達(dá)式驗(yàn)證數(shù)字的方法,感興趣的朋友參考下吧2016-12-12PHP中正則表達(dá)式對(duì)UNICODE字符碼的匹配方法
看到標(biāo)題是“請(qǐng)教PHP 一個(gè)正則匹配的問題”,又是正則表達(dá)式,好吧,看下,誰讓俺比較喜歡鼓搗正則呢。下面開始正題。2011-04-04PHP html標(biāo)簽正則替換并可自定義正則規(guī)則
PHP有個(gè)去除HTML標(biāo)簽的函數(shù)strip_tags,不過對(duì)于某些特殊符號(hào)不好使,下面這個(gè)函數(shù)的功能非常強(qiáng)大,同時(shí)用戶還可以根據(jù)自己的需要進(jìn)行正則替換.2010-05-05