求一正则, 得正确答案马上结贴

honkerhero 2012-07-06 11:31:28
现有HTML字符串
<SPAN Class="c1">
<div><span class="c2"></span>abc<span class="c2"></span>
</div>
</span>

想要结果:
<div><span class="c2"></span>abc<span class="c2"></span>
</div>

如何把最外边的span标记去掉, 换句话说, 把有内容的span标记去掉, 补充一句,class的值是不定的, 原则就是去掉包含内容的span标记, 只去标记, 内容还留在原地.

如何正确匹配开始与结束?

我现在这样写的
Regex.Replace(html3 , "<span style=\"white-space: pre;\" class=\"Apple-tab-span\">(.*?)</span>", "$1", RegexOptions.IgnoreCase);
结束标记匹配错误
...全文
206 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

string tempStr = File.ReadAllText(@"C:\Documents and Settings\Administrator\桌面\Test.txt", Encoding.GetEncoding("GB2312"));//读取txt
Regex reg = new Regex(@"(?isx) #匹配模式,忽略大小写,“.”匹配任意字符

<span[^>]*> #开始标记“<span...>”

((?> #分组构造,用来限定量词“*”修饰范围

<span[^>]*> (?<Open>) #命名捕获组,遇到开始标记,入栈,Open计数加1

| #分支结构

</span> (?<-Open>) #狭义平衡组,遇到结束标记,出栈,Open计数减1

| #分支结构

(?:(?!</?span\b).)* #右侧不为开始或结束标记的任意字符

)* #以上子串出现0次或任意多次

(?(Open)(?!))) #判断是否还有'OPEN',有则说明不配对,什么都不匹配

</span>

");


tempStr = reg.Replace(tempStr, a =>
{
return a.Groups[1].Value;

});
/*
* <div><span class="c2"></span>abc<span class="c2"></span>
</div>


<div><span class="c2"></span>abc<span class="c2"></span>
</div>
*/
huangwenquan123 2012-07-06
  • 打赏
  • 举报
回复
试试看...
            string str = @"<SPAN Class=""c1"">
<div><span class=""c2""></span>abc<span class=""c2""></span>
</div>
</span>
<SPAN Class=""c1"">
<div><span class=""c2""></span>abc<span class=""c2""></span>
</div>
</span>
";
Regex reg = new Regex(@"(?is)<span[^>]*?>[^<>]+((?:(?:(?<Open><[^>]+?>)[^<>]*)*(?:(?<-Open></[^>]+?>)[^<>]*)*)*)(?(Open)(?!))</span>");
foreach (Match m in reg.Matches(str))
Console.WriteLine(m.Groups[1].Value);
honkerhero 2012-07-06
  • 打赏
  • 举报
回复
<SPAN Class="c1">
<div><span class="c2"></span>abc<span class="c2"></span>
</div>
</span>
<SPAN Class="c1">
<div><span class="c2"></span>abc<span class="c2"></span>
</div>
</span>
这样的话, 会把头和尾去掉, HTML格式乱了
honkerhero 2012-07-06
  • 打赏
  • 举报
回复
我怎么写的.* .......
honkerhero 2012-07-06
  • 打赏
  • 举报
回复
不是, 系统中可能有很多这样的标记, 但原则就是把span中的内容从中拿出来
  • 打赏
  • 举报
回复
[code=C#]string pattern = @"(?i)(?<=<SPAN Class=""c1"">)[\s\S]*(?=</span>)";
string tempStr = Regex.Match(tempStr,pattern).Value;
[/code]
huangwenquan123 2012-07-06
  • 打赏
  • 举报
回复
内容只有这样吗?
string result = Regex.Replace(str, @"(?is)<span[^>]*?>(.+)</span>", "$1");
honkerhero 2012-07-06
  • 打赏
  • 举报
回复
啊, 人呢
honkerhero 2012-07-06
  • 打赏
  • 举报
回复
再问一下, 能不能把前半截补全, 把后半截去掉, 变成下边的样子

fdsafsdfsdfa<SPAN Class=""c1""></span>
<div><span class=""c2""></span>abc<span class=""c2""></span>
</div>
asdfasdfasd
<SPAN Class=""c1""></span>
<div><span class=""c2""></span>abc<span class=""c2""></span>
</div>
fsad
honkerhero 2012-07-06
  • 打赏
  • 举报
回复
谢谢两位正则高手, 每人100分
huangwenquan123 2012-07-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
GROUP取出来了, 怎么替换?
[/Quote]喔 你是要替换,
            string str = @"fdsafsdfsdfa<SPAN Class=""c1"">
<div><span class=""c2""></span>abc<span class=""c2""></span>
</div>
</span>asdfasdfasd
<SPAN Class=""c1"">
<div><span class=""c2""></span>abc<span class=""c2""></span>
</div>
</span>fsad
";
Regex reg = new Regex(@"(?is)\s*<span[^>]*?>((?:(?<Open>)<span[^>]*?>|(?<-Open>)</span>|(?:(?!</?span).)*)*)(?(Open)(?!))</span>\s*");
str = reg.Replace(str, "$1");
Console.WriteLine(str);
honkerhero 2012-07-06
  • 打赏
  • 举报
回复
GROUP取出来了, 怎么替换?

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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