过客,求解一个正则表达式

csdn_风中雪狼 2009-12-30 09:10:51

<div class="bizDetail vcard">
<h1 class="bizName fn">Samaritano, John CPA PC</h1>
<div class="bizAddr">
<address class="adr">
<span class="street-address">555 Broadhollow Rd. (Rt. 110),Suite

230</span><span class="locality">Melville</span><span class="commaSep">,</span><span

class="region">NY</span><span class="postal-code">11747-5078</span>
</address>
</div>

<div>





</div>


<div class="tel">
<span class="type">Local:</span>
<span class="value">(631) 249-5979</span>
</div>

<div class="tel">
<span class="type">Fax:</span>
<span class="value">(631) 249-7490</span>
</div>

<p class="call"><a href="http://www.yellowbook.com/clicktocall/call.aspx?

listingId=1836670044&addressId=1&phoneType=Local" onclick="return GB_c2c('',

this.href);" title="Click to call: Local Phone Number">Have this business call me</a></p>
<div class="bizWeb url"><a href="http://www.nycpas.net" target="_blank"

onclick="OmLeadClick('profile: website link', true, '2558');PVifyExternalLink

('img_external_1836670044_','/externaltracking?

listingid=1836670044&listingtype=paidlisting_gold&url=http%253a%252f%

252fwww.nycpas.net');" title="Go to website: www.nycpas.net">www.nycpas.net</a></div><div

class="bizWeb email"><a href="mailto:johns@nycpas.net?subject=Link from yellowbook.com"

onclick="OmLeadClick('profile: email link', false, '3442');"

title="Email">johns@nycpas.net</a></div>

</div>

</div>

<div class="threeColumn">


我想从上面的字符串得到的信息如下:
(1) Samaritano, John CPA PC
(2) 555 Broadhollow Rd. (Rt. 110),Suite 230
(3) Melville,NY11747-5078
(4) (631) 249-5979
(5) www.nycpas.net
(6) johns@nycpas.net

想通过一个正则表达式来实现,请指教,谢谢
...全文
282 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_风中雪狼 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 lxcnn 的回复:]
引用 37 楼 lzxue1989 的回复:
过客,网址和email有时有,有时两者都没有,有时两者只有其一,正则表达式需要怎么样修改下

try...
C# codeRegex reg=new Regex(@"(?is)<h1[^>]*>(?<h1>(?:(?!</?h1\b).)*)</h1>(?:(?!<span\b).)*<span\s+class=""street-address"">(?<street>(?:(?!</span>).)*)</span>\s*<span[^>]*>(?<locality>(?:(?!</address>).)*)</address>(?:(?!Local:).)*Local:</span>\s*<span\s+class=""value"">(?<local>(?:(?!</span>).)*)</span>(?:(?!<div\s+class=""bizWeb\s+(?:url|email)"">).)*(<div\s+class=""bizWeb\s+url"">\s*<a[^>]*>(?<link>(?:(?!</a>).)*)</a>\s*</div>)?(\s*<div\s+class=""bizWeb\s+email"">\s*<a[^>]*>(?<email>(?:(?!</a>).)*)</a>)?");
Regex regTag=new Regex(@"<[^>]*>");
Match m= reg.Match(yourStr);if (m.Success)
{
richTextBox2.Text+= m.Groups["h1"].Value.Trim()+"\n";
richTextBox2.Text+= m.Groups["street"].Value.Trim()+"\n";
richTextBox2.Text+= regTag.Replace(m.Groups["locality"].Value,"").Trim()+"\n";
richTextBox2.Text+= m.Groups["local"].Value.Trim()+"\n";
richTextBox2.Text+= m.Groups["link"].Value.Trim()+"\n";
richTextBox2.Text+= m.Groups["email"].Value.Trim()+"\n";
}
[/Quote]
麻烦过客了,现在下班了,明天来学习后就结贴了
-过客- 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 lzxue1989 的回复:]
过客,网址和email有时有,有时两者都没有,有时两者只有其一,正则表达式需要怎么样修改下[/Quote]

try...
Regex reg = new Regex(@"(?is)<h1[^>]*>(?<h1>(?:(?!</?h1\b).)*)</h1>(?:(?!<span\b).)*<span\s+class=""street-address"">(?<street>(?:(?!</span>).)*)</span>\s*<span[^>]*>(?<locality>(?:(?!</address>).)*)</address>(?:(?!Local:).)*Local:</span>\s*<span\s+class=""value"">(?<local>(?:(?!</span>).)*)</span>(?:(?!<div\s+class=""bizWeb\s+(?:url|email)"">).)*(<div\s+class=""bizWeb\s+url"">\s*<a[^>]*>(?<link>(?:(?!</a>).)*)</a>\s*</div>)?(\s*<div\s+class=""bizWeb\s+email"">\s*<a[^>]*>(?<email>(?:(?!</a>).)*)</a>)?");
Regex regTag = new Regex(@"<[^>]*>");
Match m = reg.Match(yourStr);
if (m.Success)
{
richTextBox2.Text += m.Groups["h1"].Value.Trim() + "\n";
richTextBox2.Text += m.Groups["street"].Value.Trim() + "\n";
richTextBox2.Text += regTag.Replace(m.Groups["locality"].Value, "").Trim() + "\n";
richTextBox2.Text += m.Groups["local"].Value.Trim() + "\n";
richTextBox2.Text += m.Groups["link"].Value.Trim() + "\n";
richTextBox2.Text += m.Groups["email"].Value.Trim() + "\n";
}
wallier 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 lzxue1989 的回复:]
过客,能讲解表达式中每项的含义吗?
我消化起来有点困难,呵
[/Quote]

路过学习下
csdn_风中雪狼 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 lxcnn 的回复:]
引用 33 楼 lzxue1989 的回复:
过客,能讲解表达式中每项的含义吗?
我消化起来有点困难,呵


其实就是多个正则的拼接
(?is) 忽略大小写和单行模式
<h1[^>]*>(? <h1>(?:(?! </?h1\b).)*) </h1>  取h1标签中的内容,其实(? <h1>(?:(?! </?h1\b).)*)用非贪婪模式,写起来简单些,效率也基本上不会有多大差别, <h1[^>]*>(? <h1>.*?) </h1>,主要看源字符串的形式了
(?:(?! <span\b).)* 因为接下来直到 <span才是需要关注的内容,所以用这个来匹配不是 <span的内容

接下来的就是上面这种方式的重复了,分别取关注的标签的同容,其余的忽略掉而已
[/Quote]
先把结束这个模块得,明天白天来慢慢来消化,
过客,网址和email有时有,有时两者都没有,有时两者只有其一,正则表达式需要怎么样修改下
7jdg 2009-12-31
  • 打赏
  • 举报
回复
PHP版的可以不?
mngzilin 2009-12-31
  • 打赏
  • 举报
回复

string ss = System.Text.RegularExpressions.Regex.Replace(str,@"(</?[^>]*>)|(\r\n)", "");
-过客- 2009-12-31
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 lzxue1989 的回复:]
过客,能讲解表达式中每项的含义吗?
我消化起来有点困难,呵
[/Quote]

其实就是多个正则的拼接
(?is) 忽略大小写和单行模式
<h1[^>]*>(?<h1>(?:(?!</?h1\b).)*)</h1> 取h1标签中的内容,其实(?<h1>(?:(?!</?h1\b).)*)用非贪婪模式,写起来简单些,效率也基本上不会有多大差别,<h1[^>]*>(?<h1>.*?)</h1>,主要看源字符串的形式了
(?:(?!<span\b).)* 因为接下来直到<span才是需要关注的内容,所以用这个来匹配不是<span的内容

接下来的就是上面这种方式的重复了,分别取关注的标签的同容,其余的忽略掉而已
十八道胡同 2009-12-31
  • 打赏
  • 举报
回复
顶客客
csdn_风中雪狼 2009-12-30
  • 打赏
  • 举报
回复
过客,能讲解表达式中每项的含义吗?
我消化起来有点困难,呵
csdn_风中雪狼 2009-12-30
  • 打赏
  • 举报
回复
过客的执行结果如下:
Samaritano, John CPA PC
555 Broadhollow Rd. (Rt. 110),Suite 230
Melville,NY11747-5078
(631) 249-5979
www.nycpas.net
johns@nycpas.net

完全正确呀
谢谢过客了
csdn_风中雪狼 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 lxcnn 的回复:]
现在很不适应写这样的正则,先凑合着用吧,看有没有不符合要求的地方
话说回来,其实这种需求,也没有太好的实现方式,写多个正则取多次的方式,灵活性会好些,效率上会差些,总体上来讲,也差不多的

C# codeRegex reg=new Regex(@"(?is)<h1[^>]*>(?<h1>(?:(?!</?h1\b).)*)</h1>(?:(?!<span\b).)*<span class=""street-address"">(?<street>(?:(?!</span>).)*)</span>\s*<span[^>]*>(?<locality>(?:(?!</address>).)*)</address>(?:(?!Local:).)*Local:</span>\s*<span class=""value"">(?<local>(?:(?!</span>).)*)</span>[\s\S]*?<div class=""bizWeb url"">\s*<a[^>]*>(?<link>(?:(?!</a>).)*)</a>\s*</div>\s*<div\s*class=""bizWeb email"">\s*<a[^>]*>(?<email>(?:(?!</a>).)*)</a>");
Regex regTag=new Regex(@"<[^>]*>");
Match m= reg.Match(yourStr);if (m.Success)
{
richTextBox2.Text+= m.Groups["h1"].Value.Trim()+"\n";
richTextBox2.Text+= m.Groups["street"].Value.Trim()+"\n";
richTextBox2.Text+= regTag.Replace(m.Groups["locality"].Value,"").Trim()+"\n";
richTextBox2.Text+= m.Groups["local"].Value.Trim()+"\n";
richTextBox2.Text+= m.Groups["link"].Value.Trim()+"\n";
richTextBox2.Text+= m.Groups["email"].Value.Trim()+"\n";
}
[/Quote]
这么快就出来了,先来测试下看,过会来问正则表达式中具体的每项的作用
呵呵
-过客- 2009-12-30
  • 打赏
  • 举报
回复
现在很不适应写这样的正则,先凑合着用吧,看有没有不符合要求的地方
话说回来,其实这种需求,也没有太好的实现方式,写多个正则取多次的方式,灵活性会好些,效率上会差些,总体上来讲,也差不多的

Regex reg = new Regex(@"(?is)<h1[^>]*>(?<h1>(?:(?!</?h1\b).)*)</h1>(?:(?!<span\b).)*<span class=""street-address"">(?<street>(?:(?!</span>).)*)</span>\s*<span[^>]*>(?<locality>(?:(?!</address>).)*)</address>(?:(?!Local:).)*Local:</span>\s*<span class=""value"">(?<local>(?:(?!</span>).)*)</span>[\s\S]*?<div class=""bizWeb url"">\s*<a[^>]*>(?<link>(?:(?!</a>).)*)</a>\s*</div>\s*<div\s*class=""bizWeb email"">\s*<a[^>]*>(?<email>(?:(?!</a>).)*)</a>");
Regex regTag = new Regex(@"<[^>]*>");
Match m = reg.Match(yourStr);
if (m.Success)
{
richTextBox2.Text += m.Groups["h1"].Value.Trim() + "\n";
richTextBox2.Text += m.Groups["street"].Value.Trim() + "\n";
richTextBox2.Text += regTag.Replace(m.Groups["locality"].Value, "").Trim() + "\n";
richTextBox2.Text += m.Groups["local"].Value.Trim() + "\n";
richTextBox2.Text += m.Groups["link"].Value.Trim() + "\n";
richTextBox2.Text += m.Groups["email"].Value.Trim() + "\n";
}
csdn_风中雪狼 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 flashcjy 的回复:]
Regex r = new Regex(@"(bizName fn|street-address|locality|class=""value""|title=""Email""|bizWeb url""> <a href="")["">]*(? <value>([^ <""]+( </span> <span class=""commaSep""[\s\S]*? </address>)*))");
            MatchCollection mc = r.Matches(html);
            System.Collections.IEnumerator numerator = mc.GetEnumerator();
            string valus = string.Empty;
            while (numerator.MoveNext())
            {
                Match m = (Match)numerator.Current;
                if (m == numerator || m.Groups["value"] == null) continue;
                //valus += Regex.Replace(m.Groups["value"].Value, " <[^>]*>", "").Replace("\r\n","")+" <br/>";
                valus += Regex.Replace(m.Groups["value"].Value, " <[^>]*>", "").Replace("\r\n", "") + "\r\n";
            }
            //Response.Write(valus);
            MessageBox.Show(valus);

第一次回答问题,呵呵。
[/Quote]
谢谢,我来测试下看
flashcjy 2009-12-30
  • 打赏
  • 举报
回复
注意上面又多出空格来了
flashcjy 2009-12-30
  • 打赏
  • 举报
回复
Regex r = new Regex(@"(bizName fn|street-address|locality|class=""value""|title=""Email""|bizWeb url""><a href="")["">]*(?<value>([^<""]+(</span><span class=""commaSep""[\s\S]*?</address>)*))");
MatchCollection mc = r.Matches(html);
System.Collections.IEnumerator numerator = mc.GetEnumerator();
string valus = string.Empty;
while (numerator.MoveNext())
{
Match m = (Match)numerator.Current;
if (m == numerator || m.Groups["value"] == null) continue;
//valus += Regex.Replace(m.Groups["value"].Value, "<[^>]*>", "").Replace("\r\n","")+"<br/>";
valus += Regex.Replace(m.Groups["value"].Value, "<[^>]*>", "").Replace("\r\n", "") + "\r\n";
}
//Response.Write(valus);
MessageBox.Show(valus);

第一次回答问题,呵呵。
csdn_风中雪狼 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 lxcnn 的回复:]
引用 24 楼 lzxue1989 的回复:
终于等来了,结构不是不会的,
期待解决


好,我试下吧,先写一个整体的解决当前问题,再看看有没有好点的解决办法吧
[/Quote]

麻烦了
谢谢
-过客- 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 lzxue1989 的回复:]
终于等来了,结构不是不会的,
期待解决
[/Quote]

好,我试下吧,先写一个整体的解决当前问题,再看看有没有好点的解决办法吧
csdn_风中雪狼 2009-12-30
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lxcnn 的回复:]
今天搬家,刚回来

一个正则可以是可以的,不过就是这样正则写出来太臃肿了,灵活性不好

如果能确定,结构就这样了,不会变,变化的只是想取的内容,也可以写一写
[/Quote]
终于等来了,结构不是不会的,
期待解决
-过客- 2009-12-30
  • 打赏
  • 举报
回复
今天搬家,刚回来

一个正则可以是可以的,不过就是这样正则写出来太臃肿了,灵活性不好

如果能确定,结构就这样了,不会变,变化的只是想取的内容,也可以写一写
csdn_风中雪狼 2009-12-30
  • 打赏
  • 举报
回复
请指点
加载更多回复(21)

110,566

社区成员

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

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

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