国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

.NET正則表達(dá)式使用高級(jí)技巧之反向引用

2019-11-18 17:20:04
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  反向引用,指把匹配出來(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+"+"。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 青浦区| 潜山县| 随州市| 雷州市| 瑞金市| 敦化市| 邓州市| 芦溪县| 南木林县| 依安县| 日照市| 玉门市| 大兴区| 遵化市| 南皮县| 道真| 玛沁县| 资阳市| 东乡县| 邮箱| 邵东县| 科尔| 浦县| 安新县| 新巴尔虎左旗| 青神县| 威宁| 阿拉尔市| 黑河市| 嵩明县| 个旧市| 得荣县| 织金县| 永川市| 阳春市| 陈巴尔虎旗| 玛曲县| 蛟河市| 新疆| 仪征市| 武鸣县|