反向引用,指把匹配出來(lái)的組引用到表達(dá)式本身其它地方,比如,在匹配HTML的標(biāo)記時(shí),我們匹配出一個(gè)<a>,我們要把匹配出來(lái)的a引用出來(lái),用來(lái)找到</a>,這個(gè)時(shí)候就要用到反向引用。
語(yǔ)法
a、反向引用編號(hào)的組,語(yǔ)法為/number
b、反向引用命名的組,語(yǔ)法為/k<name>
舉例
a、匹配成對(duì)的HTML標(biāo)簽
@"<(?<tag>[^/s>]+)[^>]*>.*<//k<tag>>"
b、匹配兩個(gè)兩個(gè)重疊出現(xiàn)的字符
public static void Main()
{
string s = "aabbc11asd";
Regex reg = new Regex(@"(/w)/1");
MatchCollection matches = reg.Matches(s);
foreach(Match m in matches)
Console.WriteLine(m.Value);
Console.ReadLine();
}
返回結(jié)果為aa bb 11
輔助匹配組
以下幾種組結(jié)構(gòu),括號(hào)中的Pattern都不作為匹配結(jié)果的一部分進(jìn)行保存
1、正聲明(?=)
涵義:括號(hào)中的模式必須出現(xiàn)在聲明右側(cè),但不作為匹配的一部分
public static void Main()
{
string s = "C#.net,VB.net,php,java,JScrRegex reg = new Regex(@"[/w/#]+(?=/.net)",RegexOptions.Compiled);
MatchCollection mc = reg.Matches(s);
foreach(Match m in mc)
Console.WriteLine(m.Value);
Console.ReadLine();
//輸出 C# VB JScript
}
可以看到匹配引擎要求匹配.net,但卻不把.net放到匹配結(jié)果中
2、負(fù)聲明(?!)
涵義:括號(hào)中的模式必須不出現(xiàn)在聲明右側(cè)
下例演示如何取得一個(gè)<a>標(biāo)簽對(duì)中的全部?jī)?nèi)容,即使其中包含別的HTML tag。
public static void Main()
{
string newsContent = @"url:<a href=""1.html""><img src=""1.gif"">test<span style=""color:red;"">Regex</span></a>.";
Regex regEnd = new Regex(@"</s*a[^>]*>([^<]|<(?!/a))*</s*/a/s*>",RegexOptions.Multiline);
Console.WriteLine(regEnd.Match(newsContent).Value);
//Result: <a href="1.html"><img src="1.gif">test<span style="color:red;">Regex</span></a>
Console.ReadLine();
}
3、反向正聲明(?<=)
涵義:括號(hào)中的模式必須出現(xiàn)在聲明左側(cè),但不作為匹配的一部分
4、反向負(fù)聲明(?<!)
涵義:括號(hào)中的模式必須不出現(xiàn)在聲明左側(cè)
非回溯匹配
語(yǔ)法:(?>)
涵義:該組匹配后,其匹配的字符不能通過(guò)回溯用于后面的表達(dá)式的匹配。呵呵,光看這句話肯定搞不懂,我當(dāng)初為了搞懂這個(gè)也花了不少的時(shí)間,還是通過(guò)實(shí)例來(lái)說(shuō)明吧: 原因是正則匹配是貪婪的,匹配時(shí)它會(huì)盡可能多的匹配最多的結(jié)果,所以,上例兩個(gè)正則式中的.*都會(huì)把csdn.net匹配完, 這個(gè)時(shí)候,第一個(gè)表達(dá)式在開(kāi)始匹配時(shí)發(fā)現(xiàn)/./w+沒(méi)得字符給它匹配了,所以它會(huì)進(jìn)行回溯,所謂回溯,就是把.*匹配的結(jié)果往回推,回推留出來(lái)的字符再用來(lái)匹配/./w+,直到/./w+匹配成功,整個(gè)表達(dá)式返回成功的匹配結(jié)果。而第二個(gè)表達(dá)式,因使用的是非回溯匹配,所以,.*匹配完后,不允許通過(guò)回溯來(lái)匹配/./w+,所以整個(gè)表達(dá)式匹配失敗。 請(qǐng)注意,回溯匹配是很浪費(fèi)資源的一種匹配方式,所以,請(qǐng)盡量避免您的正則式要通過(guò)回溯來(lái)成功匹配,如上例,可以換成@"/w+/.([^/.]+/.)+/w+"+"。
"
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注