最近需要使用正则表达式捕获网页内容。一些心得记录如下
1.贪婪模式和非贪婪模式:正则表达式默认是贪婪模式,也就是说在满足条件的情况下尽量多捕获内容,而非贪婪模式则相反,尽量捕获少的内容,往往需要捕获如<tr><td><table><tr></tr></table></td></tr>最内层<tr></tr>需要使用非贪婪模式,如果需要捕获到最外层<tr></tr>需要使用贪婪模式。二者的区别在于f非贪婪模式使用.*?
2.捕获分组。使用括号对正则式进行分组,然后使用Group索引获取捕获的分组内容
例子如下
Code
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
namespace WebSearchNew
{
class Program
{
static void Main(string[] args)
{
Test();
Console.Read();
}
public static void Test()
{
StringBuilder str = new StringBuilder();
str.Append("<TD width=5 height=31><IMG src=\"images/dian.gif\" border=0></TD>");
str.Append("<TD vAlign=midden align=left> <A class=DLink title=济南市国有建设用地使用权挂牌出让公告-济国土资告字[2009]31号");
str.Append("onclick=\"javascript:return pub_showContent(this.href,'550','530');\"");
str.Append("href=\"http://www.jndlr.gov.cn/ecdomain/framework/jngtzyj/kdaoflll-ghkh-bbno-ljla-mkjmfpmciooh.do?isfloat=1&disp_template=templatedefault&fileid=20091009122105781\"");//匹配链接
str.Append("target=_blank height=\"31\" width=\"158\">济南市国有建设用地使用权挂牌出让公告-济国土资告字[2009]31号</A></TD>");
string html = str.ToString();
//匹配目标:http://www.jndlr.gov.cn/ecdomain/framework/jngtzyj/kdaoflll-ghkh-bbno-ljla-mkjmfpmciooh.do?isfloat=1&disp_template=templatedefault&fileid=20091009122105781
Regex r0 = new Regex("href=\".*\"");//贪婪模式捕获最大匹配内容
Regex r1 = new Regex("href=\"(.*?)\"");//非贪婪模式捕获最小匹配内容 .*?
Regex r2 = new Regex("\"158\">(.*?)</A>");//捕获括号内内容即:济南市国有建设用地使用权挂牌出让公告-济国土资告字[2009]31号
Regex r3 = new Regex(@"20\d\d");//捕获括号内内容即:2009
string links0 = r0.Matches(html)[0].Groups[1].Value;
string links = r1.Match(html).Groups[1].Value;//捕获第一分组,正则表达式Index从1开始而非0
string title = r2.Match(html).Groups[1].Value;
string year = r3.Match(title).Value;
Console.WriteLine(links);
Console.WriteLine(title);
Console.WriteLine(year);
}
}
}