首页 新闻 会员 周边

求助高手,正则表达式问题

0
悬赏园豆:40 [已解决问题] 解决于 2011-09-24 11:35

有如下html文本,求一正则表达式:

<div>
<p>sss</p>
<p>ddd</p>
</div>

<div>
<p>222</p>
<p>sss</p>
</div>

<div>
<p>mmm</p>
<p>sss</p>
</div>

我要查找出符合这样条件的<div></div>片段:内部包含sss,但是不包含ddd

如上符合条件的是:<div>
<p>222</p>
<p>sss</p>
</div>  和 

 <div>
<p>mmm</p>
<p>sss</p>
</div>

用正则表达式怎么写?

Jotin的主页 Jotin | 初学一级 | 园豆:160
提问于:2011-09-21 21:45
< >
分享
最佳答案
1

C#正则表达式:

Regex regex = new Regex(@"<div>((?<!d)d(?!d)|[^d])+sss((?<!d)d(?!d)|[^d])+</div>"); 
收获园豆:40
dudu | 高人七级 |园豆:30948 | 2011-09-21 22:50

谢谢!

Jotin | 园豆:160 (初学一级) | 2011-09-24 11:34
其他回答(1)
1

dudu用的是贪婪模式,你可以试试平衡组,先分离出所有的div,再查看是否含有sss

示例如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace Demo201109
{
class Program
{
static void Main(string[] args)
{
string s = "<div><p>sss</p><p>ddd</p></div><div><p>222</p><p>sss</p></div><div><p>mmm</p><p>sss</p></div>";
string r = @"(?is)<div[^>]*>(?><div[^>]*>(?<o>)|</div>(?<-o>)|(?:(?!</?div\b).)*)*(?(o)(?!))</div>";
SplitString(r, s);
Console.ReadKey();
}


static void SplitString(string regPattern, string SrcString)
{
if (string.IsNullOrEmpty(regPattern) || string.IsNullOrEmpty(SrcString))
{
return;
}
Regex rgx = new Regex(regPattern,RegexOptions.Compiled);
MatchCollection matches = rgx.Matches(SrcString);
//得到所有嵌套的div集合
if (matches.Count > 0)
{
//Console.WriteLine("{0} ({1}个匹配项):", SrcString, matches.Count);
foreach (Match match in matches)
{
string v = match.Value;
//如果该匹配项的值含有sss,并且不含有ddd,输出该值
if (v.IndexOf("sss") > 0 && v.IndexOf("ddd") < 0)
{
Console.WriteLine("" + match.Value);
}
}

}
}
}
}

结果:

//  <div><p>222</p><p>sss</p></div>
// <div><p>mmm</p><p>sss</p></div>
邀月 | 园豆:25475 (高人七级) | 2011-09-22 10:40

同样谢谢!

支持(0) 反对(0) Jotin | 园豆:160 (初学一级) | 2011-09-24 11:35
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册