一、以前的方法
对于正则,除非是专门做这一块,我一直都是懵懵懂懂,要不就是等到有需要了,再到网上找资料。网上的一篇30分钟学会正则非常不错!
而我对正则使用的比较多就是采集的时候根据两边字符取中间的字符。一下是我以前的写的一个方法:
public static List<string> returnAMark(string regexbegin, string regexend, string text) { MatchCollection markMatchs = Regex.Matches(text, regexbegin + @"(?<content>.*)" + regexend, RegexOptions.IgnoreCase | RegexOptions.Multiline); var marks = new List<string>(); foreach (Match nextMatch in markMatchs) { marks.Add(nextMatch.Groups["content"].ToString()); } return marks; }
比如采集的时候根据html采集特殊字符,就只要传入两边的字符既可以,返回的是个string的List类型。
二、进步
当要从同一字符串去的数据比较多时候,参考了这边文章的代码:
public List<DomainResult> GetDomainResults(string output) { var domainResults = new List<DomainResult>(); Regex regexContent = new Regex("<tr class=\"bg(1|2)\">(?<content>.*?)</tr>", RegexOptions.Singleline | RegexOptions.IgnoreCase); Regex regexProperty = new Regex( "<td class=\"field_domain\">.*?\">(?<domain>.*?)</a>(<ul|</td).*?<td class=\"field_pr\">.*?\"><span>(?<pr>.*?)</span></a></td>.*?<td class=\"field_abirth\"><a.*?results\">(?<year>.*?)</a>.*?<td class=\"field_whois\">.*?\">(?<regtext>.*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Singleline); if (regexContent.IsMatch(output)) { var domainText = regexContent.Matches(output); foreach (var item in domainText) { var domainResult = new DomainResult(); if(regexProperty.IsMatch(item.ToString())) { var property = regexProperty.Match(item.ToString()); domainResult.Name = property.Groups["domain"].Value; domainResult.Pr = Convert.ToInt32(property.Groups["pr"].Value); domainResult.Year = Convert.ToInt32(property.Groups["year"].Value); domainResult.isReg = property.Groups["regtext"].Value.Equals("available"); } domainResults.Add(domainResult); } } return domainResults; }
其中根据一个正则表达式获取多个数据,但是经过测试,必须用Match()方法,就是只能返回一个结果。