利用Match类和MatchCollection类,可以获得通过一个正则表达式实现的每一个匹配的细节。Match表示一次匹配,而MatchCollection类是一个Match对象的集合,其中的每一个对象都表示了一次成功的匹配。
我们可以使用Regex对象的Match()方法和Matches()方法来检索匹配。
1.Match()方法
前三种方法是实例方法,后两种是静态方法,所有方法都返回一个Match对象,其中包含了匹配的各种细节!注意:Match()对象只代表实现的第一次匹配,而不是所有的匹配!区别于Matches()!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Regular
{
class Program
{
static void Main(string[] args)
{
string inStr = "sea sem seg,word,love,sed";
Regex myRegex=new Regex("se.");
Match myMatch = myRegex.Match(inStr, 4);
while (myMatch.Success)
{
//MessageBox.Show(myMatch.Value);
Console.WriteLine(myMatch.Value);
myMatch = myMatch.NextMatch();
}
Console.ReadKey();
}
}
}
2.MatchCollection()方法
使用Regex.Matches()方法,可以得到MathCollection对象的一个引用。这个集合类中包含分别代表每一次正则表达式匹配的Match对象。在处理多匹配时尤其有用,而且可以代替Match.NextMatch()方法。
MatchCollection类有两个有用的属性Count和Item。Count返回匹配的次数,Item允许通过下表访问每一个Match对象!
MatchCollection mc = Regex.Matches(changeData.FirstOrDefault().Field<string>("BusinessContent").GetNotNullString(), "【(.*?)】");
int count = mc.Count;
if (count > 0)
{
drs["GravePosition"] = mc[2].Value.Replace("【", "").Replace("】", "");
}
MatchCollection mc = Regex.Matches("AA 55 CA 00 CA EE 77", @"(?i)[\da-f]{2}");//正值表达式
List< byte > buf = new List<byte>();//填充到这个临时列表中 //依次添加到列表中
foreach (Match m in mc)//数组或对象集合中的每个元素重复一个嵌入语句组
{
buf.Add(byte.Parse(m.Value, System.Globalization.NumberStyles.HexNumber));
}
string text = "1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11Q 12J 13K 14L 15M 16N ffee80 #800080"; Regex rgx = new Regex(@"((\d+)([a-z]))\s+", RegexOptions.IgnoreCase); MatchCollection mm = rgx.Matches(text); string x=mm[5].Groups[2].Captures[0].Value; //x为第六个集合 第二组 的值 6 /// <summary> /// 显示Match内多个Group的例子 /// </summary> public void ShowStructure() { //要匹配的字符串 string text = "1A 2B 3C 4D 5E 6F 7G 8H 9I 10J 11Q 12J 13K 14L 15M 16N ffee80 #800080"; //正则表达式 string pattern = @"((\d+)([a-z]))\s+"; //使用RegexOptions.IgnoreCase枚举值表示不区分大小写 Regex r = new Regex(pattern, RegexOptions.IgnoreCase); //使用正则表达式匹配字符串,仅返回一次匹配结果 Match m = r.Match(text); while (m.Success) { //显示匹配开始处的索引值和匹配到的值 System.Console.WriteLine("Match=[" + m + "]"); CaptureCollection cc = m.Captures; foreach (Capture c in cc) { Console.WriteLine("\tCapture=[" + c + "]"); } for (int i = 0; i < m.Groups.Count; i++) { Group group = m.Groups[i]; System.Console.WriteLine("\t\tGroups[{0}]=[{1}]", i, group); for (int j = 0; j < group.Captures.Count; j++) { Capture capture = group.Captures[j]; Console.WriteLine("\t\t\tCaptures[{0}]=[{1}]", j, capture); } } //进行下一次匹配. m = m.NextMatch(); } }
其它常见C#正则表达式类: Regex 类表示不可变(只读)的正则表达式。它还包含各种静态方法,允许在不显式创建其他类的实例的情况下使用其他正则表达式类。 Match 类表示正则表达式匹配操作的结果。Match 类的 Match.Success 匹配是否成功。Match.Index 返回第一个匹配的位置。 MatchCollection 类表示成功的【非重叠】匹配项的序列。MatchCollection 的实例是由 Regex.Matches 方法返回的。 GroupCollection 类表示被捕获的组的集合,并在单个匹配项中返回该捕获组的集合。GroupCollection 的实例在 Match.Groups 属性返回的集合中返回。 CaptureCollection 类表示捕获的子字符串的序列,并返回由单个捕获组所执行的捕获集。由于限定符,捕获组可以在单个匹配中捕获多个字符串。Captures 属性(CaptureCollection 类的对象)作为 Match 和 Group 类的成员提供,目的是便于对捕获的子字符串的集合进行访问。 Group 类表示来自单个捕获组的结果。因为 Group 可以在单个匹配中捕获零个、一个或更多的字符串(使用限定符),所以它包含 Capture 对象的集合。因为 Group 继承自 Capture,所以可以直接访问最后捕获的子字符串(Group 实例本身等价于 Captures 属性返回的集合的最后一项)。 Capture 类包含来自单个子表达式捕获的结果。