求教一个数据采集的正则问题?类似([^<]*)

jasonpower 2010-03-14 11:39:09
最近在做一个数据采集的东西,其他都没问题。在正则匹配时遇到麻烦了.

情况大致是这样,A:strIn = "<a href="">我要获得的字符串</a>", Match Match1 = Regex.Match(strIn, ">([^<]*)</a>", RegexOptions.IgnoreCase | RegexOptions.Multiline); //strIn 是待匹配字符串. 这样是没问题的,我可以获得我想要的结果。

但是遇到 B:strIn =
@"<li class="ttttt"><em>名称:</em>
<div class="tt"><span>我想要的名称</span>"这样的情况时,我想用Match Match2 = Regex.Match(strArr[i], "<em>名称:([^<]*)</span>", RegexOptions.IgnoreCase | RegexOptions.Multiline); 获得“:</em><div class="tt"><span>我想要的名称”(然后再replace多余部分),就无法匹配成功了。

问题应该是出在“([^<]*)” 这里。这段正则我也是很早以前用过,这次做新项目就照搬过来。其实也不是很理解,按我目前所知的:^是文本开头;^<应该是是以左尖括号开始;[]不确定该怎么理解?;*代表可以匹配0或者n次(如果是0次,貌似这段正则也就没什么意义了。但是不写也不对,因为不写的话A也匹配不出来)。

求教一下这段正则该怎么写,最好能有注释。觉得分不够可以再加,谢谢!!
...全文
96 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
小_虎 2010-03-14
  • 打赏
  • 举报
回复
-过客- 2010-03-14
  • 打赏
  • 举报
回复
入门其实还是很容易的,只不过正则比较抽象,需要经常练习,加深理解,否则忘记比入门更容易
小_虎 2010-03-14
  • 打赏
  • 举报
回复
To楼上过客大哥。。

多久能入门?

我怎么看了又忘了。。
-过客- 2010-03-14
  • 打赏
  • 举报
回复
try...

string strIn = @"<li class=""ttttt""><em>名称:</em>
<div class=""tt""><span>我想要的名称</span>";
Regex reg = new Regex(@"(?isn)<em>名称:((?!</?span\b).)*<span>(?<name>((?!</?span\b).)*)</span>");
Match m = reg.Match(strIn);
if (m.Success)
{
richTextBox2.Text = m.Groups["name"].Value;
}


至于正则的解释,不是三两句话能说清楚的,有兴趣的话可以看下我的博客
-过客- 2010-03-14
  • 打赏
  • 举报
回复
-过客- 2010-03-14
  • 打赏
  • 举报
回复
正则不是为这个目的而存在的

正则因抽象所以可以处理很多情况,但所处理的情况永远都只能算是个例,而不会是所有情况

楼主的需求,虽然可以在一定程度上实现,但总会有不满足的时候的

string strIn = @"<li class=""ttttt""><em>名称:</em>
<div class=""tt""><span>我想要的名称</span>";
string start = Regex.Escape("<em>名称:");
string end = Regex.Escape("</span>");
Regex reg = new Regex(@"(?isn)(?<=" + start + @")((?!" + end + ").)*(?=" + end + ")");
Regex regTag = new Regex(@"<[^>]*>");
Match m = reg.Match(strIn);
if (m.Success)
{
richTextBox2.Text = regTag.Replace(m.Value, "").Trim();
}


这里的冗余代码,只能是完全已知的,或是html标签,其它情况处理不了
xupeihuagudulei 2010-03-14
  • 打赏
  • 举报
回复
那些意思当时看的时候是知道的
不过过段时间不看又给忘了
jasonpower 2010-03-14
  • 打赏
  • 举报
回复
To lxcnn (过客):

您的正则表达式是OK的,而且可以一次把需要的内容匹配出来。不过通用性不理想。

其实我只是想要一个通用一点的正则,可以把符合“头”“尾”定义的字符串摘取出来,(有其他冗余代码的,再replace掉,或者做第二次正则匹配),并不需要一步到位。“((?!</?span\b).)*<span>(?<name>((?!</?span\b).)*)”这个正则很正确没错,但是遇到其他情况我不知道该如何调整

另外问一下,“(?isn)”起什么作用呢?

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧