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();
        }
    }
}

输出结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值