[数据结构与算法]模式匹配-数量词

在编写正则表达式的时候,经常会向要向正则表达式添加数量型数据,诸如”精确匹配两次”或者”匹配一次或多次”。利用数量词就可以把这些数据添加到正则表达式里面了。
数量词(+):这个数量词说明正则表达式应该匹配一个或多个紧紧接其前的字符。

       string[] words = new string[] { "bad", "boy", "baad", "baaad" ,"bear", "bend" };
            foreach (string word in words) 
            {
                if (Regex.IsMatch(word, "ba+")) 
                {
                    Console.WriteLine(word);
                }
            }
            Console.Read();

表达式指明每一个以字母“b”开头并且包含一个或多个字母”a”的字符串都会产生匹配。
有较少限制的数量词就是星号().这个数量词说明正则表达式应该匹配零个或多个紧接其前的字符。但是在时间中这个数量词非常难用,因为星号通常会导致匹配几乎所有内容。例如。利用前面的代码,如果把正则表达式变成读取”ba“,那么数组中的每一个单词都会匹配。
问号(?)是一种精确匹配零次或一次的数量词。如果把先前代码中的正则表达式变为”ba?d”,那么只有一个单词”bad”可以匹配。
通过在一对大括号内部放置一个数可以指定一个有限的数量的匹配,就想在{n}中,这里的n是要找到匹配的数量。

       if (Regex.IsMatch(word, "ba{2}d"))
                {
                    Console.WriteLine(word);
                }

匹配:baad
通过在大括号内提供两个数字可以指定匹配的最大值和最小值:{n,m},这里的n表示匹配的最小值而m则表示最大值。”ba{1,3}d”将可以匹配”bad”,”baad”,”baaad”。
这里还可以通过编写”ba{1,}d” 来匹配相同数量的字符串。”ba{1,}d”说明至少要有一个匹配,但是没有指定最大匹配数量。
到目前为止已经讨论过的数量词展示的就是所谓的贪心行为。他们试图有尽可能多的匹配,而且这种行为经常会导致不预期的匹配。

    string[] words = new string[] { "part", "of", "baad", "this", "<b>string</b>", "is","bold" };
            string regExp = "<.*>";
            MatchCollection aMatch;
            foreach (string word in words)
            {
                if (Regex.IsMatch(word, regExp))
                {
                    aMatch = Regex.Matches(word,regExp);
                    for (int i = 0; i < aMatch.Count; i++) 
                    {
                        Console.WriteLine(aMatch[i].Value);
                    }

                }

            }
            Console.Read();

        }

*
原本期望这个程序就返回两个标签:。但是由于贪心,正则表达匹配string.利用惰性量词:问号(?)就可以解决这个问题。当问号直接放在原有数量词的后边时,数量词就变懒惰了。这里的惰性是指在正则表达式中用到的惰性量词将试图做尽可能少的匹配,而不是尽可能多的匹配了。
<.+?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厦门德仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值