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();
}
}
}
输出结果如下: