在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
前面两篇讲述了正则表达式的基础和一些简单的例子,这篇将稍微深入一点探讨一下正则表达式分组,在.NET中正则表达式分组是用Match类来代表的。
/// <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(); } }
这段代码的执行效果如下: /// <summary> /// 使用Regex类的Matches方法所有所有的匹配 /// </summary> public void Matches() { //要匹配的字符串 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); //使用正则表达式匹配字符串,返回所有的匹配结果 MatchCollection matchCollection = r.Matches(text); foreach (Match m in matchCollection) { //显示匹配开始处的索引值和匹配到的值 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); } } } }
上面的这段代码和采用While循环遍历所有匹配的结果是一样的,在实际情况中有可能出现不需要全部匹配而是从某一个位置开始匹配的情况,比如从第32个字符处开始匹配,这种要求可以通过Match()或者Matches()方法的重载方法来实现,仅需要将刚才的实例代码中的MatchCollection matchCollection = r.Matches(text);改为MatchCollection matchCollection = r.Matches(text,48);就可以了。 下面通过例子演示如何将上面的UBB编码转换成HTML代码: /// <summary> /// 下面的代码实现将文本中的UBB超级链接代码替换为HTML超级链接代码 /// </summary> public void UBBDemo() { string text = "[url=http://zhoufoxcn.blog.51cto.com][/url][url=http://blog.csdn.net/zhoufoxcn]周公的专栏[/url]"; Console.WriteLine("原始UBB代码:" + text); Regex regex = new Regex(@"(/[url=([ /S/t]*?)/])([^[]*)(/[//url/])", RegexOptions.IgnoreCase); MatchCollection matchCollection = regex.Matches(text); foreach (Match match in matchCollection) { string linkText = string.Empty; //如果包含了链接文字,如第二个UBB代码中存在链接名称,则直接使用链接名称 if (!string.IsNullOrEmpty(match.Groups[3].Value)) { linkText = match.Groups[3].Value; } else//否则使用链接作为链接名称 { linkText = match.Groups[2].Value; } text = text.Replace(match.Groups[0].Value, "<a href="/" mce_href="/""" + match.Groups[2].Value + "/" target=/"_blank/">" + linkText + "</a>"); } Console.WriteLine("替换后的代码:"+text); }
程序执行结果如下: |
请发表评论