在编写正则表达式的时候,经常会向要向正则表达式添加数量型数据,诸如”精确匹配两次”或者”匹配一次或多次”。利用数量词就可以把这些数据添加到正则表达式里面了。
数量词(+):这个数量词说明正则表达式应该匹配一个或多个紧紧接其前的字符。
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.利用惰性量词:问号(?)就可以解决这个问题。当问号直接放在原有数量词的后边时,数量词就变懒惰了。这里的惰性是指在正则表达式中用到的惰性量词将试图做尽可能少的匹配,而不是尽可能多的匹配了。
<.+?>