c# 贪婪匹配 html,C#正则表达式之贪婪模式

1、贪婪模式演示:(当提取多个超链接的时候)

•    “1111。11。111。111111。”

•    贪婪:.+。(默认为贪婪模式,尽可能的多匹配。)

•    非贪婪:.+?。(尽可能的少匹配,(1个。))

2、从文本提取出名字:Match match = Regex.Match("大家好。我是S.H.E。我22岁了。我病了,呜呜。fffff","我是(.+)。");//没有加^$。

3、看结果。+、*的匹配默认是贪婪(greedy)的:尽可能多的匹配,直到“再贪婪一点儿”其后的匹配模式就没法匹配为止。

4、在+、*后添加?就变成非贪婪模式(? 的另外一个用途):让其后的匹配模式尽早的匹配。修改成"我是(.+?)。"

5、一般开发的时候不用刻意去修饰为非贪婪模式,只有遇到bug的时候发现是贪婪模式的问题再去解决。如果匹配的结果比自己预想的要多,那么一般都是贪婪模式的原因。

示例演示:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Text.RegularExpressions;

namespace _13贪婪模式介绍

{

class Program

{

static void Main(string[] args)

{

//默认正则表达式采用贪婪模式,尽可能多的进行匹配

string str = "啊哈哈hello worldwwwwwwww!嘎嘎!";

//提取英文

//当正则表达式提取的时候,如果1个字符也能匹配,多个字符也能匹配,这时,会按照使用最多字符的方式来匹配,这个就叫贪婪模式。

//当终止贪婪模式后会按照最小的方式来匹配。

string regStr = "[a-zA-Z]+";//提取结果:hello

string regStr1 = "[a-zA-Z]+?";//提取结果:h;使用?来终止贪婪模式(注:在限定符后面使用)

Match match = Regex.Match(str, regStr);

Console.WriteLine("========贪婪模式========");

Console.WriteLine(match.Value);

Console.WriteLine("========非贪婪模式========");

Match match1 = Regex.Match(str, regStr1);

Console.WriteLine(match1.Value);

//======================贪婪模式

Console.WriteLine("========贪婪模式========");

string str2 = "1111。1 1。 111。111111。";

//字符串提取

string regStr2 = ".+。";

//因为.+要尽可能多的匹配。所以会认为1111。1 1。 111。111111。都是.+匹配的结果,

//但是由于正则表达式中最后还有一个 : 。 ,所以如果要是将.+匹配了所有的字符,则最后的 。 (句号)无法找到匹配,

//正则表达式会尽可能的找到匹配,所以会将 。(句号)尝试给正则表达式中的最后一个字符(句号)来匹配,然后把前面的所有字符都用.+;来匹配。

Match match2 = Regex.Match(str2, regStr2);

Console.WriteLine(match2.Value);

Console.WriteLine("========非贪婪模式========");

string str3 = "1111。1 1。 1。 111。111111。";

//字符串提取

string regStr3 = ".+?。";//终止贪婪模式

//结果:1111。,因为.+?表示终结贪婪模式,所以只能提取出来第一个1,但是后面还有个 句号:。 ,

//所以为了匹配句号只能再向后搜索3个1,然后找到句号。所以就是1111。

Match match3 = Regex.Match(str3, regStr3);

Console.WriteLine(match3.Value);

Console.ReadKey();

}

}

}

输出结果如下:

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值