如:
<div>1div</div>
<a>1a</a>
<p>1p</p>
<p>2p</p>
<div>2div</div>
<a>2a</a>
<p>3p</p>
<p>4p</p>
<a>3a</a>
<p>5p</p>
<div>3div</div>
<a>4a</a>
<p>6p</p>
<span>1span</span>
现在的问题是:有N多DIV,N多p,N多A标签以及最多1个span,想只获取所有p里的内容以及最后一个span里的内容(其中获取P的内容有一个条件,那就是只有前面有一个A标签的P的内容才会被获取),span或许有或许没有,如果有就获取,如果没有就不获取求:
<div>1div</div>
<a>1a</a>
<p>1p</p>
<p>2p</p>
<div>2div</div>
<a>2a</a>
<p>3p</p>
<p>4p</p>
<a>3a</a>
<p>5p</p>
<div>3div</div>
<a>4a</a>
<p>6p</p>
<span>1span</span>
现在的问题是:有N多DIV,N多p,N多A标签以及最多1个span,想只获取所有p里的内容以及最后一个span里的内容(其中获取P的内容有一个条件,那就是只有前面有一个A标签的P的内容才会被获取),span或许有或许没有,如果有就获取,如果没有就不获取求:
C#的正则表达式
using System.Text.RegularExpressions;

string restult = "";
foreach(Match m in Regex.Matches(str ,@"(?ins)(?<=(</a>\s*<(?<mark>p[^>]*>)|<(?<mark>span)[^>]*>))[\s\S]+?(?=</\k<mark>)"))
{
restult +=m.Value;//就是你要的结果
MessageBox.Show(m.Value);
}
foreach(Match m in Regex.Matches(str ,@"(?ins)(?<=(</a>\s*<(?<mark>p[^>]*>)|<(?<mark>span)[^>]*>))[\s\S]+?(?=</\k<mark>)"))
{
restult +=m.Value;//就是你要的结果
MessageBox.Show(m.Value);
}
或是用
foreach(Match m in Regex.Matches(yourHtml,@"(?is)(</a>\s*<(?<mark>p[^>]*>)|<(?<mark>span)[^>]*>)(?<data>[\s\S]+?)</\k<mark>"))
{
m.Groups["data"].Value;//
}
{
m.Groups["data"].Value;//
}
或是>>>>>>获得字符串中开始和结束字符串中间得值

#region 获得字符串中开始和结束字符串中间得值
/// <summary>
/// 获得字符串中开始和结束字符串中间得值
/// </summary>
/// <param name="begin">开始匹配标记</param>
/// <param name="end">结束匹配标记</param>
/// <param name="html">Html字符串</param>
/// <returns>返回中间字符串</returns>
public static MatchCollection GetMidValue(string begin, string end, string html)
{
Regex reg = new Regex("(?<=(" + begin + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline);
return reg.Matches(html);
}
#endregion
/// <summary>
/// 获得字符串中开始和结束字符串中间得值
/// </summary>
/// <param name="begin">开始匹配标记</param>
/// <param name="end">结束匹配标记</param>
/// <param name="html">Html字符串</param>
/// <returns>返回中间字符串</returns>
public static MatchCollection GetMidValue(string begin, string end, string html)
{
Regex reg = new Regex("(?<=(" + begin + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline);
return reg.Matches(html);
}
#endregion

/// <summary>
/// 获得字符串中开始和结束字符串中间得值
/// </summary>
/// <param name="str"></param>
/// <param name="s">开始</param>
/// <param name="e">结束</param>
/// <returns></returns>
private string getvalue(string str, string start, string end)
{
Regex rg = new Regex("(?<=(" + start + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline);
return rg.Match(str).Value;
}
/// 获得字符串中开始和结束字符串中间得值
/// </summary>
/// <param name="str"></param>
/// <param name="s">开始</param>
/// <param name="e">结束</param>
/// <returns></returns>
private string getvalue(string str, string start, string end)
{
Regex rg = new Regex("(?<=(" + start + "))[.\\s\\S]*?(?=(" + end + "))", RegexOptions.Multiline | RegexOptions.Singleline);
return rg.Match(str).Value;
}
//正则抽取单个Table , 可根据table内的某个标识字符, good !
如果仅仅是以“会员资料”这样的做为参考标识,用我上面写的稍稍改造就可以了,问题的复杂在于,如果以“00”或者“444”做为参考标识,就要考虑到<table>标签嵌套的问题,既要保证取包含参考标识的最内层<table>,又要保证<table>和</table>配对匹配

Match mm = Regex.Match(html, @"<table[^>]*>(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))\b" + "会员资料" + @"\b(?:(?!<table[^>]*>)[\s\S])*?(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))</table>", RegexOptions.IgnoreCase);
输入的参考标识中如果有正则中有特殊意义的字符,需要对其进行预处理,另外需要在程序中进行异常处理,这个自己处理下吧
如果源字符串中同时多处出现输入的参考标识,这里取第一个出现的参考标识所在的<table>
//正则抽取单个Table中 , 解析tb中的内容.........

Match mm = Regex.Match(html, @"<table[^>]*>(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))\b" + "会员输赢资料" + @"\b(?:(?!<table[^>]*>)[\s\S])*?(((<table[^>]*>(?<o>)|</table>(?<-o>)|(?!</?table)[\s\S])*)(?(o)(?!)))</table>", RegexOptions.IgnoreCase);
if (mm.Success)
{
//MessageBox.Show(mm.Value);
//MatchCollection mdd = GetMidValue("<td", "</td>", mm.Value);
//foreach (Match m in mdd)
//{
// for (int i = 1; i < m.Groups.Count; i++)
// {
// restult += m.Groups[i].Value;//就是你要的结果
// }
//}
MatchCollection mc = Regex.Matches(mm.Value, @"<td[^>]*>\s*(?<content>[\s\S]*?)\s*</td>", RegexOptions.IgnoreCase);
foreach(Match m in mc)
{
for (int i = 1; i < m.Groups.Count; i++)
{
restult += m.Groups[i].Value + "\n";
}
}
MessageBox.Show(restult);
}
if (mm.Success)
{
//MessageBox.Show(mm.Value);
//MatchCollection mdd = GetMidValue("<td", "</td>", mm.Value);
//foreach (Match m in mdd)
//{
// for (int i = 1; i < m.Groups.Count; i++)
// {
// restult += m.Groups[i].Value;//就是你要的结果
// }
//}
MatchCollection mc = Regex.Matches(mm.Value, @"<td[^>]*>\s*(?<content>[\s\S]*?)\s*</td>", RegexOptions.IgnoreCase);
foreach(Match m in mc)
{
for (int i = 1; i < m.Groups.Count; i++)
{
restult += m.Groups[i].Value + "\n";
}
}
MessageBox.Show(restult);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2009-10-22 Asp : 生成xml数据 及解决Flex里的中文显示乱码问题。。。
2009-10-22 Flex : 利用HTTPService DataGrid从XML文件中加载数据
2009-10-22 Flex : Line Chart BackgroundElement color (结合Grid做网格线的例子)
2009-10-22 Flex: 改变lineChart数据点(交点)颜色值及样式,ItemRenderer border color