捕獲組
語法:
html
字符 正則表達式 |
描述spa |
示例orm |
(pattern)server |
匹配pattern並捕獲結果,自動設置組號。htm |
(abc)+d索引 匹配abcd或者abcabcdci |
(?<name>pattern)字符串 或string (?'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。
例如:
(?<=& lt;(\w+)>).*(?=<\/\1>)匹配不包含屬性的簡單HTML標籤內的內容。如:<div>hello& lt;/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的整數 |
這個不解釋了。