十万火急,如何使用正则表达式将指定的html字符文本数据先分离、后替换出来?谢谢。

wtoeb 2006-10-28 02:36:16
using System;
using System.Collections;
using System.Text.RegularExpressions;
public class MyClass
{
public static void Main()
{
string msg = null;
string str = null;
str += "<table width=\"100%\" align=\"center\" border=\"0\">";
str += " <tr>";
str += " <td width=\"777\" valign=\"top\">";
str += " <msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>";
str += " <msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>";
str += " <msii id = \"T.Item\" value = \"news:local\" style=\"classics:134\"/>";
str += " <msii id = \"S.List\" value = \"page:local\" style=\"classics:332\"></msii>";
str += " </td>";
str += " </tr>";
str += "</table>";
string regexString=@"(\S*?)\s*?=\s*?""(.*?)""";
//在这里实现:
//1.将msii标签里的数据分离出来,分别表达成独立的数据。
//如将:<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>分离后得到:V.Menu;news:local;classics:166。
//2.将msii标签替换成相应标签里的数值。
//如将:<msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>替换成:H.Menu - page:local - classics:103
//3.msii标签说明:
//(1)msii标签支持两种形式:<msii …></msii>和<msii … />
//(2)msii标签内的参数值可能是:value = "…"、value = '…'或value = …;
//……
Console.WriteLine(msg);//打印结果
}
}
...全文
240 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wtoeb 2006-10-30
  • 打赏
  • 举报
回复
using System;
using System.Collections;
using System.Text.RegularExpressions;
public class MyClass
{
public static void Main()
{
string msg = null;
string str = null;
str += "<table width=\"100%\" align=\"center\" border=\"0\">";
str += "<tr>";
str += "<td width=\"777\" valign=\"top\">";
str += "第1行.<msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>";
str += "第2行.<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>";
str += "第3行.<msii id = \"T.Item\" value = \"news:local\" style=\"classics:134\"/>";
str += "第4行.<msii id = \"S.List\" value = \"page:local\" style=\"classics:332\"></msii>";
str += "第5行.<msii id="icon.menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>";
str += "第6行.<msii id="icon.menu" value="news:02x" style="left:129">这是一条测试信息</msii>";
str += "</td>";
str += "</tr>";
str += "</table>";

//以下取得html文本中存在多少个msii标签对
string regexString = @"(<msii[^>]*/>)|(<msii[^>]*>.*?</msii>)";
Regex matchesRegex = new Regex(regexString);
MatchCollection matchFound = matchesRegex.Matches(ReturnText);
if(matchFound.Count>0)
{
//以下只是将某msii标签对中的数据分离出来如:id=……、value=……、style=……,但是如果将<msii></msii>标签对之间的(非空格)数据也取出来成为独立的数据应该怎么表达式?即是指<msii></msii>标签对之间可能是空格,也可能是文本或图片地址(如:<img src="../image/ccc.gif">将视为一个整体)。如果是空格则当作无空格处理。
RegExPattern = @"(\S*?)\s*?=\s*?""(.*?)""";
for(int i=0;i<matchFound.Count;i++)
{
ReturnTextSub = matchFound[i].ToString().Trim();
}
}
}
}

//在这里实现:
//1.将msii标签里的数据分离出来,分别表达成独立的数据。
//如将:<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>分离后得到三个部分:V.Menu;news:local;classics:166。
//2.若<msii ……>……</msii>标签中有数值(非空格数据)的,则将标签之间的也分离出来成为独立的数据。
//如将第五行<msii id="icon.menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>分离得到四个部分:icon.menu;news:001;left:129;<img src="../image/ccc.gif">
//而将第六行<msii id="icon.menu" value="news:02x" style="left:129">这是一条测试信息</msii>分离得到四个部分:icon.menu;news:001;left:129;这是一条测试信息
//<a href="news:02x">这是一条测试信息</a>

//3.msii标签说明:
//(1)msii标签支持三种形式:<msii … />、<msii …></msii>和<msii ……>……</msii>
//(2)msii标签内的参数值的表现形式可能是:
// id = …、id = '…'、id="…"(=号两边可能有空格);
// value = "…"、value = '…'或value = …(=号两边可能有空格);
// style = "…"、style = '…'或style = …(=号两边可能有空格);
//……
Console.WriteLine(msg);//打印结果
}
}
qltouming 2006-10-30
  • 打赏
  • 举报
回复
朋友曾经过一个工具,处理这种问题正合适,很容易。
下载地址:http://www.kinghack.com/zzzzzzzzzzz/homepage/ch2sh4/wordbat.htm#

有问题可直接联系我:qltouming@hotmail.com
petshop4 2006-10-30
  • 打赏
  • 举报
回复
测试数据
<msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
<msii id = "V.Menu" value = "news:local" style="classics:166"/>
正则替换旧字符串:
<msii id\s*=\s*(["'])(?<id>.*?)\1.*?value\s*=\s*(["'])(?<value>.*?)\2.*?.*?style\s*=\s*(["'])(?<style>.*?)\3.*?(/>|</msii>)
正则替换新字符串:
$5-$6-$7
结果:
H.Menu-page:local-classics:103
V.Menu-news:local-classics:166

petshop4 2006-10-30
  • 打赏
  • 举报
回复
欢迎访问正则测试页 http://www.17897.com/regextext.aspx
petshop4 2006-10-30
  • 打赏
  • 举报
回复
测试数据:
<msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
<msii id = "V.Menu" value = "news:local" style="classics:166"/>
正则:<msii id\s*=\s*(["'])(?<id>.*?)\1.*?value\s*=\s*(["'])(?<value>.*?)\2.*?.*?style\s*=\s*(["'])(?<style>.*?)\3.*?(/>|</msii>)
模式:IgnoreCase, Singleline
捕获数:2
捕获 1 :
<msii id = "H.Menu" value = "page:local" style="classics:103"></msii>
==============================华丽的分隔线===============================
捕获 2 :
<msii id = "V.Menu" value = "news:local" style="classics:166"/>
==============================华丽的分隔线===============================
捕获 1 :
组 1 : "
组 2 : "
组 3 : "
组 4 : </msii>
组 5 : H.Menu
组 6 : page:local
组 7 : classics:103
==============================华丽的分隔线===============================
捕获 2 :
组 1 : "
组 2 : "
组 3 : "
组 4 : />
组 5 : V.Menu
组 6 : news:local
组 7 : classics:166
==============================华丽的分隔线===============================
程序的色彩 2006-10-30
  • 打赏
  • 举报
回复
楼上的都说了。接分了。
wtoeb 2006-10-30
  • 打赏
  • 举报
回复
不能这样做,因为我还要实现下面这样的目的:
<msii id="icon.menu" value="news:001" style="left:129"><img src="../image/ccc.gif"></msii>
或:
<msii id="icon.menu" value="news:001" style="left:129">这是一条测试信息</msii>

都将被替换成:
<a href="news:001"><img src="../image/ccc.gif"></a>
或:
<a href="news:001">这是一条测试信息</a>

紧急求助一下各位先生兄弟。
qltouming 2006-10-30
  • 打赏
  • 举报
回复
我错了,没注意到楼主的 3.msii标签说明
ilove8 2006-10-30
  • 打赏
  • 举报
回复
==============================华丽的分隔线===============================
qltouming 2006-10-30
  • 打赏
  • 举报
回复
格式统一成/>结尾的,然后

旧字符串 <msii id = \"(\S+)\" value = \"(\S+)\" style=\"(\S+)"/>
新字符串 $1,$2,$3
qltouming 2006-10-30
  • 打赏
  • 举报
回复
先把格式统一成/>结尾的,然后

<msii id = \"(\S+)\" value = \"(\S+)\" style=\"(\S+)"/>
blackant2 2006-10-29
  • 打赏
  • 举报
回复
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Collections.Generic;

public class MyClass
{
public static void Main()
{
string str = null;
str += "<table width=\"100%\" align=\"center\" border=\"0\">";
str += "<tr>";
str += "<td width=\"777\" valign=\"top\">";
str += "<msii id = \"H.Menu\" value = \"page:local\" style=\"classics:103\"></msii>";
str += "<msii id = \"V.Menu\" value = \"news:local\" style=\"classics:166\"/>";
str += "<msii id = \"T.Item\" value = \"news:local\" style=\"classics:134\"/>";
str += "<msii id = \"S.List\" value = \"page:local\" style=\"classics:332\"></msii>";
str += "</td>";
str += "</tr>";
str += "</table>";
Display1(str);
Display2(str);

Console.Read();
}
static void Display2(string str){
Regex reg=new Regex("<msii +id *= *(['|\"]?)([a-z\\d\\:\\.]+)\\1 +value *= *(['|\"]?)([a-z\\d\\:\\.]+)\\3 +style *= *(['|\"]?)([a-z\\d\\:\\.]+)\\5(/>|></msii>)",RegexOptions.IgnoreCase);
foreach(Match match in reg.Matches(str)){
Console.WriteLine(match.Groups[0].Value);
Console.WriteLine("id={0}",match.Groups[2].Value);
Console.WriteLine("value={0}",match.Groups[4].Value);
Console.WriteLine("style={0}",match.Groups[6].Value);
}
}
static void Display1(string str){
Regex reg=new Regex("<msii(( *\\w+) *= *(['|\"]?)([a-z\\d\\:\\.]+)\\3)+(/>|></msii>)",RegexOptions.IgnoreCase);
foreach(Match match in reg.Matches(str)){
Console.WriteLine(match.Groups[0].Value);
Regex reg2=new Regex("( *\\w+) *= *(['|\"]?)([a-z\\d\\:\\.]+)\\2",RegexOptions.IgnoreCase);
foreach(Match mc in reg2.Matches(match.Groups[0].Value)){
Console.WriteLine("{0}={1}",mc.Groups[1].Value,mc.Groups[3].Value);
}

}
}
}
wtoeb 2006-10-28
  • 打赏
  • 举报
回复
能不能详细一些?谢谢。
blackant2 2006-10-28
  • 打赏
  • 举报
回复
如果ID/Value/Style已知都存在并且顺序固定
也可以一次完成
<msii id *= *(['|"]?)([a-z\d\:\.]+)\1 value *= *(['|"]?)([a-z\d\:\.]+)\3 style *= *(['|"]?)([a-z\d\:\.]+)\5(/>|></msii>)
blackant2 2006-10-28
  • 打赏
  • 举报
回复
<msii(( \w+) *= *(['|"]?)([a-z\d\:\.]+)\3)+(/>|></msii>)

不过分两次来判断可能更好一些
先找出msii节点
再取值
wtoeb 2006-10-28
  • 打赏
  • 举报
回复
和xml没有任何关系,因为原来的系统要求的就是这样啊。
股神 2006-10-28
  • 打赏
  • 举报
回复
ding
blackant2 2006-10-28
  • 打赏
  • 举报
回复
象这个问题用xml来处理明显比正则要好办
为什么一定要正则?
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-28 02:36
社区公告

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